- 定义Binder池AIDL接口:IBinderPool
- 统一管理Binder池:BinderPoolManager
- 实现WorkService
- 拓展各业务模块Binder
IBinderPool.aidl
interface IBinderPool {
IBinder query(in int code);
}
BinderPoolManager.java
// BinderPoolManager.java
public class BinderPoolManager {
public static final int CODE_MODULE_A = 0x000;
public static final int CODE_MODULE_B = 0x001;
private static BinderPoolManager sInstance;
public static BinderPoolManager getInstance(Context context) {
if (null == sInstance) {
synchronized (BinderPoolManager.class) {
if (null == sInstance) {
sInstance = new BinderPoolManager(context);
}
}
}
return sInstance;
}
private Context mAppContext;
private ServiceConnection mConnection;
private IBinderPool mBinderPool;
private IBinder.DeathRecipient mDeathRecipient;
public IBinder query(int code) {
if (null != mBinderPool && mBinderPool.asBinder().isBinderAlive()) {
try {
return mBinderPool.query(code);
} catch (RemoteException e) {
e.printStackTrace();
}
}
return null;
}
private BinderPoolManager(Context context) {
mAppContext = context.getApplicationContext();
mDeathRecipient = new IBinder.DeathRecipient() {
@Override
public void binderDied() {
mBinderPool.asBinder().unlinkToDeath(mDeathRecipient, 0);
// 清空连接
mBinderPool = null;
// 断开重连
connectService();
}
};
mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.e("BinderPool", "onServiceConnected: ");
mBinderPool = IBinderPool.Stub.asInterface(service);
try {
mBinderPool.asBinder().linkToDeath(mDeathRecipient, 0);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
// 连接服务
connectService();
}
private synchronized void connectService() {
mAppContext.bindService(new Intent(mAppContext, WorkService.class),
mConnection, Context.BIND_AUTO_CREATE);
}
public static class BinderPoolImpl extends IBinderPool.Stub {
@Override
public IBinder query(int code) throws RemoteException {
switch (code) {
case CODE_MODULE_A:
return new ModuleAImpl();
case CODE_MODULE_B:
return new ModuleBImpl();
default:
return null;
}
}
}
}
WorkService.java
public class WorkService extends Service {
private Binder mBinderPool = new BinderPoolManager.BinderPoolImpl();
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mBinderPool;
}
}
业务模块A
// IModuleA.aidl
interface IModuleA {
void work();
}
// ModuleAImpl.java
public class ModuleAImpl extends IModuleA.Stub{
@Override
public void work() throws RemoteException {
Log.e("ModuleAImpl", "work: ");
}
}
业务模块B
// IModuleB.aidl
interface IModuleB {
void work();
}
// ModuleBImpl.java
public class ModuleBImpl extends IModuleA.Stub {
@Override
public void work() throws RemoteException {
Log.e("ModuleBImpl", "work: ");
}
}
客户端调用:MainAcitivty.java
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 可在Application中初始化
BinderPoolManager.getInstance(getApplicationContext());
findViewById(R.id.imageView).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
IBinder iBinder = BinderPoolManager.getInstance(getApplicationContext())
.query(BinderPoolManager.CODE_MODULE_A);
if(null == iBinder){
Log.e("Main", "onClick: binder is null" );
return;
}
IModuleA iModuleA = ModuleAImpl.asInterface(iBinder);
try {
// 注意:此方法会使客户端挂起,本应运行在子线程中
iModuleA.work();
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
}
}
参考《Android开发艺术探索》