Android bind service使用Binder 池的方法
1.创建aidl文件,创建单独的aidl仓库,在aidl仓库添加如下aidl文件 包括:1.1 主aidl文件 IIpcService.aidl(IpcService.onBind直接返回IIpcService接口实现),提供Binder 池获取方法。1.2 客户端监听aidl文件 IIpcServiceListener.aidl,用于客户端向服务端注册监听。1.3Binder 池中模块1 aid
一、aidl 服务端实现
1.创建aidl文件,创建单独的aidl仓库,在aidl仓库添加如下aidl文件 包括:
1.1 主aidl文件 IIpcService.aidl(IpcService.onBind直接返回IIpcService接口实现),提供Binder 池获取方法。
import android.os.ParcelFileDescriptor;
import com.android.demo.aidl.IIpcServiceListener;
// Declare any non-default types here with import statements
interface IIpcService {
/**
* 根据binder代码查询对应的Binder对象
* @param binderCode 服务标识码
* @return 对应的Binder对象
*/
IBinder queryBinder(int binderCode);
/**
* 注册客户端监听器到服务端
* @param packageName 客户端包名
* @param ipcServiceListener 客户端监听器
*/
void register2Server(String packageName,IIpcServiceListener ipcServiceListener);
/**
* 从服务端注销客户端监听器
* @param packageName 客户端包名
*/
void unregister2Server(String packageName);
/**
* 处理客户端请求并返回结果
* @param packageName 客户端包名
* @param clientRequest 客户端请求内容
* @param pfd 用于传输大数据的文件描述符
* @return 处理结果
*/
String processClientRequest(String packageName,String clientRequest,inout ParcelFileDescriptor pfd);
/**
* 处理客户端请求(单向异步且串行调用,无返回值)
* @param packageName 客户端包名
* @param clientRequest 客户端请求内容
*/
oneway void processClientRequestOneway(String packageName,String clientRequest);
1.2 客户端监听aidl文件 IIpcServiceListener.aidl,用于客户端向服务端注册监听。
interface IIpcServiceListener {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
// void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
// double aDouble, String aString);
String processServiceRequest(String serviceRequest);
}
1.3 Binder 池中模块1 aidl文件 IBinderModule1.aidl,处理模块1业务。
interface IBinderModule1 {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
// void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
// double aDouble, String aString);
String doWork(String serviceRequest);
}
1.4 Binder 池中模块2 aidl文件 IBinderModule2.aidl,处理模块2业务。
interface IBinderModule2 {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
// void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
// double aDouble, String aString);
String doWork(String serviceRequest);
}
2.创建service IpcService.java 及 服务端binder请求处理类LocalIpcRepositoryImpl。
IpcService.java 中创建了IIpcService.Stub实现类,该实现类queryBinder方法,基于客户端请求的binderCode,返回创建的对应的binder模块实现类。
public class IpcService extends BaseService {
private static final String TAG = AppConstants.APP_TAG + "IpcService ";
private NetBroadcastReceiver mNetBroadcastReceiver;
HandlerThread mHandlerThread = new HandlerThread("IpcService");
Handler mWorkHandler;
@Override
public IBinder onBind(Intent intent) {
return mIpcService;
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate() ");
//registerReceiver();
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy");
//unregisterReceiver();
}
private IIpcService.Stub mIpcService = new IIpcService.Stub() {
@Override
public IBinder queryBinder(int binderCode) throws RemoteException {
IBinder binder = null;
switch (binderCode) {
case BINDER_MODULE1:
binder = new BinderModule1Impl();
break;
case BINDER_MODULE2:
binder = new BinderModule2Impl();
break;
default:
Log.d(TAG, "queryBinder invalid binderCode=" + binderCode);
break;
}
return binder;
}
@Override
public void register2Server(String packageName, IIpcServiceListener ipcServiceListener) throws RemoteException {
Looper.prepare();
LocalIpcRepositoryImpl.getInstance().register2Server(packageName, ipcServiceListener);
}
@Override
public void unregister2Server(String packageName) throws RemoteException {
LocalIpcRepositoryImpl.getInstance().unregister2Server(packageName);
}
@Override
public String processClientRequest(String packageName, String clientRequest, ParcelFileDescriptor pfd) throws RemoteException {
Log.d(TAG, "processClientRequest");
return LocalIpcRepositoryImpl.getInstance().processClientRequest(packageName, clientRequest,pfd);
}
@Override
public void processClientRequestOneway(String packageName, String clientRequest) throws RemoteException {
Log.d(TAG, "processClientRequestOneway");
LocalIpcRepositoryImpl.getInstance().processClientRequestOneway(packageName, clientRequest);
}
};
}
public class LocalIpcRepositoryImpl implements LocalIpcRepository {
private static final String TAG = AppConstants.APP_TAG + "LocalIpcRepositoryImpl";
private HashMap<String, IIpcServiceListener> mServiceListenerMap = new HashMap<>();
private IUiShow mUiShow = null;
private static volatile LocalIpcRepositoryImpl mInstance;
private MutableLiveData<String> mTestLiveData1 = new MutableLiveData<>();
private MutableLiveData<String> mTestLiveData2 = new MutableLiveData<>();
//在创建一个聚合类MediatorLiveData
private MediatorLiveData<String> mMediatorLiveData = new MediatorLiveData<>();
private Handler mHandler = new Handler();
public LocalIpcRepositoryImpl() {
//分别把LiveData合并到mediatorLiveData中
mMediatorLiveData.addSource(mTestLiveData1, new Observer<String>() {
@Override
public void onChanged(String testLiveData1Str) {
Log.i(TAG, "mMediatorLiveData.onChanged mTestLiveData1 testLiveData1Str:" + testLiveData1Str);
mMediatorLiveData.postValue(testLiveData1Str);
}
});
mMediatorLiveData.addSource(mTestLiveData2, new Observer<String>() {
@Override
public void onChanged(String testLiveData2Str) {
Log.i(TAG, "mMediatorLiveData.onChanged mTestLiveData2 testLiveData2Str:" + testLiveData2Str);
mMediatorLiveData.postValue(testLiveData2Str);
}
});
}
public static LocalIpcRepositoryImpl getInstance() {
if (mInstance == null) {
synchronized (LocalIpcRepositoryImpl.class) {
if (mInstance == null) {
mInstance = new LocalIpcRepositoryImpl();
}
}
}
return mInstance;
}
@Override
public void register2Server(String packageName, IIpcServiceListener iFtIpcServiceListener) {
boolean containsKey = mServiceListenerMap.containsKey(packageName);
Log.i(TAG, "register2Server packageName:" + packageName + " containsKey?" + containsKey);
mServiceListenerMap.put(packageName, iFtIpcServiceListener);
}
@Override
public void unregister2Server(String packageName) {
boolean containsKey = mServiceListenerMap.containsKey(packageName);
Log.i(TAG, "unregister2Server packageName:" + packageName + " containsKey?" + containsKey);
if (containsKey) {
mServiceListenerMap.remove(packageName);
}
}
public void registerUiShow(IUiShow iUiShow) {
mUiShow = iUiShow;
}
/**
* 处理客户端请求
*
* @param packageName package name.
* @param clientRequest response json from client.
* @return
*/
@Override
public String processClientRequest(String packageName, String clientRequest, ParcelFileDescriptor pfd) {
Log.i(TAG, "processClientRequest 11 packageName:" + packageName
+ " clientRequest:" + clientRequest + " pfd:" + pfd);
String ret = clientRequest;
FileDescriptor fileDescriptor = pfd.getFileDescriptor();
FileInputStream fis = null;
try {
fis = new FileInputStream(fileDescriptor);
if ("text".equals(clientRequest)) {
byte[] content = new byte[5];
fis.read(content);
Log.i(TAG, "processClientRequest 111 content:" + content);
for (int i = 0; i < content.length; i++) {
Log.i(TAG, "processClientRequest 113 content[" + i + "]=" + content[i]);
}
} else {
Bitmap rawBitmap = BitmapFactory.decodeStream(fis);
ret += " process success!";
Log.i(TAG, "processClientRequest 222 rawBitmap ByteCount:" + rawBitmap.getByteCount() + " mUiShow:" + mUiShow);
if (null != mUiShow) {
mUiShow.showBitmap(rawBitmap);
}
}
} catch (Exception e) {
Log.i(TAG, "processClientRequest 33 error:" + e);
e.printStackTrace();
} finally {
try {
if (fis != null) {
fis.close();
}
} catch (IOException e) {
Log.i(TAG, "processClientRequest 44 error:" + e);
}
}
Log.i(TAG, "processClientRequest 55 end ret:" + ret);
return ret;
}
/**
* 处理客户端请求
*
* @param packageName package name.
* @param clientRequest response json from client.
* @return
*/
@Override
public boolean processClientRequestOneway(String packageName, String clientRequest) {
Log.i(TAG, "processClientRequestOneway 11 packageName:" + packageName
+ " clientRequest:" + clientRequest);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
Log.i(TAG, "processClientRequestOneway 22 end clientRequest:" + clientRequest);
return true;
}
@Override
public String callServiceClient(String serviceRequest) {
//TODO base on requestJson to call dvr or cvbox IIpcServiceListener process request,
if (null == mServiceListenerMap || mServiceListenerMap.size() == 0) {
Log.i(TAG, "callServiceClient 00 mServiceListenerMap size is 0 return!");
return null;
}
Log.i(TAG, "callServiceClient 11 mServiceListenerMap.size():"
+ mServiceListenerMap.size());
String clientResponse = null;
Iterator it = mServiceListenerMap.entrySet().iterator();
boolean dvrConnected = false;
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
String packageName = (String) entry.getKey();
IIpcServiceListener ftIpcServiceListener = (IIpcServiceListener) entry.getValue();
Log.i(TAG, "callServiceClient * 22 packageName:" + packageName
+ " ftIpcServiceListener" + ftIpcServiceListener);
try {
clientResponse = ftIpcServiceListener.processServiceRequest(serviceRequest);
} catch (DeadObjectException e) {
Log.i(TAG, "callServiceClient 33 call it.remove error:" + e);
it.remove();
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
Log.i(TAG, "callServiceClient 44 mServiceListenerMap.size():"
+ mServiceListenerMap.size());
}
return clientResponse;
}
public LiveData<String> getTestLiveData() {
// testDelaySendLiveData1(3);
// testDelaySendLiveData2(6);
return mMediatorLiveData;
}
private void testDelaySendLiveData1(int second) {
Log.i(TAG, "testDelaySendLiveData1 11 second:" + second);
mHandler.postDelayed(() -> {
Log.i(TAG, "testDelaySendLiveData1 22 call setValue second:" + second);
mTestLiveData1.setValue("delay " + second + " seconds");
}, 1000 * second);
}
private void testDelaySendLiveData2(int second) {
Log.i(TAG, "testDelaySendLiveData2 11 second:" + second);
mHandler.postDelayed(() -> {
Log.i(TAG, "testDelaySendLiveData2 22 call setValue second:" + second);
mTestLiveData2.setValue("delay " + second + " seconds");
}, 1000 * second);
}
//模拟数据变化调用
public void delaySetValue() {
Log.i(TAG, "delaySetValue ");
testDelaySendLiveData1(3);
testDelaySendLiveData2(6);
}
}
3.创建服务端IBinderModule1.aidl实现类BinderModule1Impl和IBinderModule2.aidl实现类BinderModule2Impl
public class BinderModule1Impl extends IBinderModule1.Stub {
private static final String TAG = "BinderModule1Impl ";
@Override
public String doWork(String serviceRequest) throws RemoteException {
Log.i(TAG, "doWork: " + "serviceRequest=" + serviceRequest);
return "BinderModule1Impl.doWork";
}
}
public class BinderModule2Impl extends IBinderModule2.Stub {
private static final String TAG = "BinderModule2Impl ";
@Override
public String doWork(String serviceRequest) throws RemoteException {
Log.i(TAG, "doWork: " + "serviceRequest=" + serviceRequest);
return "BinderModule2Impl.doWork";
}
}
二、aidl 请求工具类
1.创建绑定服务请求封装类IpcManager.java 和绑定服务常量类IpcServiceConstant.java添加到 aidl仓库。
public class IpcManager {
private static final String TAG = "IpcManager ";
private static volatile IpcManager mInstance;
private Context mContext;
private String mPackageName;
private IIpcService mIpcService;
private IIpcServiceListener mIpcServiceListener;
private ServiceConnectListener mServiceConnectListener;
public static final int BINDER_MODULE1 = 1;
public static final int BINDER_MODULE2 = 2;
private IpcManager(Context context) {
mContext = context;
mPackageName = (null == mContext ? null : mContext.getPackageName());
}
/**
* getInstance.
*
* @param context context.
* @return FileTransmissionManager.
*/
public static IpcManager getInstance(Context context) {
if (null == mInstance) {
synchronized (IpcManager.class) {
if (null == mInstance) {
mInstance = new IpcManager(context);
}
}
}
return mInstance;
}
/**
* connectService.
* should call this function first.
*
* @param serviceConnectListener ServiceConnectListener.
* @param iFtIpcServiceListener IIpcServiceListener.
*/
public void connectService(ServiceConnectListener serviceConnectListener,
IIpcServiceListener iFtIpcServiceListener) {
Log.i(TAG, "connectService: " + "mPackageName=" + mPackageName);
mServiceConnectListener = serviceConnectListener;
mIpcServiceListener = iFtIpcServiceListener;
bindService();
}
/**
* disconnectService.
*/
public void disconnectService() {
Log.i(TAG, "disconnectService");
unregister(mPackageName);
unbindService();
}
/**
* processClientRequest
*
* @param clientRequest
*/
public String processClientRequest(String clientRequest, ParcelFileDescriptor pfd) {
Log.i(TAG, "processClinentRequest 11 ** mPackageName:" + mPackageName
+ " mFtIpcService:" + mIpcService + " clientRequest:" + clientRequest + " pfd:" + pfd);
if (null != mIpcService) {
try {
return mIpcService.processClientRequest(mPackageName, clientRequest, pfd);
} catch (RemoteException e) {
Log.e(TAG, "processClinentRequest 22 e:" + e);
e.printStackTrace();
}
}
return "error";
}
/**
* processClientRequest
*
* @param clientRequest
*/
public void processClientRequestOneway(String clientRequest) {
Log.i(TAG, "processClientRequestOneway 11 ** mPackageName:" + mPackageName
+ " mFtIpcService:" + mIpcService + " clientRequest:" + clientRequest);
if (null != mIpcService) {
try {
mIpcService.processClientRequestOneway(mPackageName, clientRequest);
} catch (RemoteException e) {
Log.e(TAG, "processClientRequestOneway 22 e:" + e);
e.printStackTrace();
}
}
}
//region 客户端Binder池调用测试
/**
* 从服务端Binder池中获取binderCode对应的IBinder,并进行测试调用。
*
* @param binderCode
*/
public String queryBinderAndTestCall(int binderCode) {
String ret = "";
IBinder binder = null;
try {
binder = mIpcService.queryBinder(binderCode);
} catch (RemoteException e) {
throw new RuntimeException(e);
}
if (null == binder) {
Log.e(TAG, "queryBinderAndTestCall binder is null for binderCode:" + binderCode);
return "null == binder";
}
switch (binderCode) {
case BINDER_MODULE1:
ret = testBinderModule1(binder);
break;
case BINDER_MODULE2:
ret = testBinderModule2(binder);
break;
}
return ret;
}
private String testBinderModule1(IBinder binder) {
String result = "";
IBinderModule1 module1 = IBinderModule1.Stub.asInterface(binder);
try {
result = module1.doWork("testBinderModule1");
Log.i(TAG, "testBinderModule1 result:" + result);
} catch (RemoteException e) {
Log.e(TAG, "testBinderModule1 e:" + e);
e.printStackTrace();
}
return result;
}
private String testBinderModule2(IBinder binder) {
String result = "";
IBinderModule2 module2 = IBinderModule2.Stub.asInterface(binder);
try {
result = module2.doWork("testBinderModule2");
Log.i(TAG, "testBinderModule2 result:" + result);
} catch (RemoteException e) {
Log.e(TAG, "testBinderModule2 e:" + e);
e.printStackTrace();
}
return result;
}
//endregion
private void bindService() {
Log.i(TAG, "bindService mPackageName:" + mPackageName);
Intent intent = new Intent();
intent.setComponent(new ComponentName(IpcServiceConstant.SERVICE_PKG_NAME,
IpcServiceConstant.SERVICE_DATA_COLLECTION_NAME));
startService(intent);
mContext.bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
private void unbindService() {
Log.i(TAG, "unbindService mPackageName:" + mPackageName);
if (isServiceConnected()) {
mContext.unbindService(mConnection);
mIpcService = null;
}
}
private void startService(Intent intent) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
mContext.startForegroundService(intent);
} else {
mContext.startService(intent);
}
}
private void reConnect() {
if (!isServiceConnected()) {
Log.i(TAG, "reConnect ");
bindService();
}
}
private boolean isServiceConnected() {
return null != this.mIpcService;
}
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i(TAG, "onServiceConnected name = " + name);
mIpcService = IIpcService.Stub.asInterface(service);
if (null != mServiceConnectListener) {
mServiceConnectListener.onConnected();
register(mPackageName, mIpcServiceListener);
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.i(TAG, "onServiceDisconnected name = " + name + " mServiceConnectListener:" + mServiceConnectListener);
mIpcService = null;
if (null != mServiceConnectListener) {
mServiceConnectListener.onDisconnected();
unregister(mPackageName);
}
reConnect();
}
};
private void register(String packageName, IIpcServiceListener iFtIpcServiceListener) {
Log.i(TAG, "register: packageName = " + packageName
+ " iFtIpcServiceListener:" + iFtIpcServiceListener);
if (isServiceConnected()) {
try {
mIpcService.register2Server(packageName, iFtIpcServiceListener);
} catch (RemoteException e) {
Log.e(TAG, e.getMessage(), e);
}
}
}
private void unregister(String packageName) {
Log.i(TAG, "unregister: packageName = " + packageName);
if (isServiceConnected()) {
try {
mIpcService.unregister2Server(packageName);
} catch (RemoteException e) {
Log.e(TAG, e.getMessage(), e);
}
}
}
public interface ServiceConnectListener {
void onConnected();
void onDisconnected();
}
}
public class IpcServiceConstant {
public static final String SERVICE_PKG_NAME = "com.android.demo.lileidemo";
public static final String SERVICE_DATA_COLLECTION_NAME = SERVICE_PKG_NAME + ".service.IpcService";
}
三、aidl 客户端
客户端引用 aidl仓库编译的aidl-debug.aar
1.创建客户端请求类 IpcUtil.java
public class IpcUtil {
private static final String TAG = AppConstants.APP_TAG + "IpcUtil";
private static volatile IpcUtil mInstance;
private IpcManager mFtIpcManager;
public static IpcUtil getInstance() {
if (null == mInstance) {
synchronized (IpcUtil.class) {
if (null == mInstance) {
mInstance = new IpcUtil();
}
}
}
return mInstance;
}
public void disconnectService() {
Log.i(TAG, "disconnectService() ");
if (null != mFtIpcManager) {
mFtIpcManager.disconnectService();
}
}
public void connectService() {
Log.i(TAG, "connectService() ");
if (null == mFtIpcManager) {
mFtIpcManager = IpcManager.getInstance(FtClientApp.getAppContext());
}
mFtIpcManager.connectService(mServiceConnectListener, mFtIpcServiceListener);
}
public void testBinderPool(int binderCode) {
Log.i(TAG, "testBinderPool() 11 binderCode:" + binderCode);
String serverRet = mFtIpcManager.queryBinderAndTestCall(binderCode);
Log.i(TAG, "testBinderPool() 22 serverRet:" + serverRet);
}
public Bitmap getTestBitmap() {
File file = new File(path);
if (!file.exists()) {
Log.i(TAG, "getTestImage() file is null for file:" + file);
return null;
}
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(file.getAbsolutePath(), options);
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(file.getAbsolutePath(), options);
}
String path = "/sdcard/lilei/20230207161749238.jpg";
public ParcelFileDescriptor getImagePfd() {
ParcelFileDescriptor pfd = null;
try {
pfd = ParcelFileDescriptor.open(new File(path), MODE_READ_WRITE);
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
Log.i(TAG, "getPfd() pfd:" + pfd);
return pfd;
}
public ParcelFileDescriptor getBitmapPfd() {
ParcelFileDescriptor pfd = null;
Bitmap bitmap = BitmapFactory.decodeResource(FtClientApp.getAppContext().getResources(), R.drawable.large2);
//将Bitmap转成字节数组
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
try {
MemoryFile memoryFile = new MemoryFile("test", bitmap.getByteCount());
Method method = MemoryFile.class.getDeclaredMethod("getFileDescriptor");
FileDescriptor des = (FileDescriptor) method.invoke(memoryFile);
pfd = ParcelFileDescriptor.dup(des);
//向内存中写入字节数组
memoryFile.getOutputStream().write(byteArray);
//关闭流
memoryFile.getOutputStream().close();
memoryFile.close();
} catch (IOException e) {
throw new RuntimeException(e);
} catch (InvocationTargetException e) {
throw new RuntimeException(e);
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
Log.i(TAG, "getPfd() pfd:" + pfd + " getByteCount:" + bitmap.getByteCount());
return pfd;
}
public ParcelFileDescriptor getTextPfd() {
ParcelFileDescriptor pfd = null;
try {
MemoryFile memoryFile = new MemoryFile("test", 1024);
Method method = MemoryFile.class.getDeclaredMethod("getFileDescriptor");
FileDescriptor des = (FileDescriptor) method.invoke(memoryFile);
pfd = ParcelFileDescriptor.dup(des);
//向内存中写入字节数组
memoryFile.getOutputStream().write(new byte[]{1, 2, 5, 4, 3});
//关闭流
memoryFile.getOutputStream().close();
memoryFile.close();
} catch (IOException e) {
throw new RuntimeException(e);
} catch (InvocationTargetException e) {
throw new RuntimeException(e);
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
Log.i(TAG, "getTextPfd() pfd:" + pfd);
return pfd;
}
public void sendFileOneway(String responseJson) {
Log.i(TAG, "sendFileOneway() responseJson:" + responseJson);
if (null != mFtIpcManager) {
mFtIpcManager.processClientRequestOneway(responseJson);
}
}
/**
* DVR or CVBOX generates the JSON format required by
* the mobile app from the files to be sent.
*
* @param requestJson json to be send to phone.
*/
public String sendFile(String requestJson) {
Log.i(TAG, "sendFile() requestJson:" + requestJson);
if (null != mFtIpcManager) {
return mFtIpcManager.processClientRequest(requestJson, getBitmapPfd());
}
return "error";
}
private IpcManager.ServiceConnectListener mServiceConnectListener = new IpcManager.ServiceConnectListener() {
@Override
public void onConnected() {
Log.i(TAG, "onConnected() ");
}
@Override
public void onDisconnected() {
Log.i(TAG, "onDisconnected() recall connectService");
connectService();
}
};
private IIpcServiceListener.Stub mFtIpcServiceListener = new IIpcServiceListener.Stub() {
@Override
public String processServiceRequest(String serviceRequest) throws RemoteException {
String response = "response from ft client";
Log.i(TAG, "processJsonRequest() serviceRequest:" + serviceRequest);
return response;
}
// @Override
// public String processJsonRequest(String requestJson) throws RemoteException {
// String responseJson = IpcTestDataUtil.getInstance().processJsonRequest(requestJson);
// Log.i(TAG, "processJsonRequest() requestJson:" + requestJson);
// return responseJson;
// }
};
}
2.界面调用Binder 池中的对象及接口方法。
IpcUtil.getInstance().testBinderPool(IpcManager.BINDER_MODULE1);
IpcUtil.getInstance().testBinderPool(IpcManager.BINDER_MODULE2);
更多推荐

所有评论(0)