【Android】使用Binder池减少Service进程数
16lz
2021-01-23
- 定义Binder池AIDL接口:IBinderPool
- 统一管理Binder池:BinderPoolManager
- 实现WorkService
- 拓展各业务模块Binder
IBinderPool.aidl
interface IBinderPool { IBinder query(in int code);}
BinderPoolManager.java
// BinderPoolManager.javapublic 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.aidlinterface IModuleA { void work();}// ModuleAImpl.javapublic class ModuleAImpl extends IModuleA.Stub{ @Override public void work() throws RemoteException { Log.e("ModuleAImpl", "work: "); }}
业务模块B
// IModuleB.aidlinterface IModuleB { void work();}// ModuleBImpl.javapublic 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开发艺术探索》
更多相关文章
- Android 仿网易一元夺宝客户端下拉加载动画实现(一)
- 手机淘宝Android客户端架构
- 南青信息查询 for Android客户端
- Android客户端与服务器端交互,如何保持session回话
- 微服务-Android客户端: 实现注册和登录
- Android仿人人客户端(v5.7.1)——项目框架新做的调整描述(项目中基
- [置顶] Android硬件抽象层模块编写规范