在连接池中实现,根据标识返回不同Binder
static class BinderPoolImpl extends IBinderPool.Stub {
@Override
public IBinder queryBinder(int binderCode) throws RemoteException {
IBinder binder =null;
switch (binderCode) {
case BINDER_COMPUTE:
binder = new ComputeImpl();
break;
case BINDER_SECURITY_CENTER:
binder = new SecurityCenterImpl();
break;
}
return binder;
}
}
Service比较简单,逻辑处理都放在Binder线程池中
package com.breezehan.ipc.binderpool;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
public class BinderPoolService extends Service {
private static final String TAG = “BinderPoolService”;
private IBinder binderPool = new BinderPool.BinderPoolImpl();
public BinderPoolService() {
}
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG, “onBind”);
return binderPool;
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
Binder线程池的具体实现,同时需处理Binder死亡代理问题。
public class BinderPool {
private static final String TAG = “BinderPool”;
public static final int BINDER_NONE = -1;
public static final int BINDER_COMPUTE = 0;
public static final int BINDER_SECURITY_CENTER = 1;
private static volatile BinderPool sInstance;//确保并发取值正确性
private final Context mContext;
//控制多个线程时,某一线程中代码执行顺序;是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行
private CountDownLatch mConnectBinderPoolCountDownLatch;
private IB