优势
- 不需要手动绑定service
- 获取远程服务是同步的
- 自动保持服务进程优先级
- 跨进程事件总线支持
- 支持IPC的Callback
不足
- 默认只支持 同App 内的不同进程之间进行通信,无法支持 跨App进行通信;
- 无法在代码层面指定通信进程,只能在gradle脚本中配置 ,不够灵活;
整体架构图
问题解析
1. 如何做到不需要手动绑定service ?
每个进程初始化时,互换Binder
Client 端 到 中间层 通过 Intent 传递Binder
//让ServiceDispatcher注册到当前进程
public void sendRegisterInfo() {
if (dispatcherProxy == null) {
//后面考虑还是采用"has-a"的方式会更好
BinderWrapper wrapper = new BinderWrapper(this.asBinder());
Intent intent = new Intent(context, DispatcherService.class);
intent.setAction(Constants.DISPATCH_REGISTER_SERVICE_ACTION);
intent.putExtra(Constants.KEY_REMOTE_TRANSFER_WRAPPER, wrapper);
intent.putExtra(Constants.KEY_PID, android.os.Process.myPid());
ServiceUtils.startServiceSafely(context, intent);
}
}
最终保存到 EventDispatcher transferBinders Map 当中。
private Map<Integer, IBinder> transferBinders = new ConcurrentHashMap<>();
中间层到 Client 通过 AIDL 调用
private void registerAndReverseRegister(int pid, IBinder transterBinder) {
Logger.d("DispatcherService-->registerAndReverseRegister,pid=" + pid + ",processName:" + ProcessUtils.getProcessName(pid)