1. 定义Binder池AIDL接口:IBinderPool
  2. 统一管理Binder池:BinderPoolManager
  3. 实现WorkService
  4. 拓展各业务模块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开发艺术探索》

更多相关文章

  1. Android 仿网易一元夺宝客户端下拉加载动画实现(一)
  2. 手机淘宝Android客户端架构
  3. 南青信息查询 for Android客户端
  4. Android客户端与服务器端交互,如何保持session回话
  5. 微服务-Android客户端: 实现注册和登录
  6. Android仿人人客户端(v5.7.1)——项目框架新做的调整描述(项目中基
  7. [置顶] Android硬件抽象层模块编写规范

随机推荐

  1. 从零开始学Xamarin.Forms(四) Android 准
  2. Android Studio——ListView的高级使用
  3. android 修改系统程序图标大小
  4. Android NDK纯C++开发
  5. Android 内存以及相应的泄漏问题收集中
  6. android 设置背景透明 半透明 透明
  7. [Android Pro] android Flag介绍
  8. Unity整合Android , 错误Fatal signal 11
  9. Android 制作签名
  10. Activity之生命周期