IPC机制—Inter-Process Communication(二)
《Android开发与探索》
一、完整的通过AIDL进行IPC的过程
P71
传统AIDL+Service的组合可以实现Client端和Server端之间的通信
整理来自:https://blog.csdn.net/ding3106/article/details/83506819
###1 Client端调用Server端
1)创建 Parcelable AIDL文件
2)创建要操作的实体类,实现 Parcelable 接口,实现序列化/反序列化
3)创建接口 aidl 文件
4)Make project ,生成Aidl对应的 Binder Java 文件
服务端
5)创建 Service,并在其中创建上面生成的 Binder 对象实例(Stub子类),实现接口定义的方法
6)在 onBind() 中返回上一步中Binder对象实例
客户端
7)实现 ServiceConnection 接口,在其中拿到 AIDL 类,通过asInterface()转换为 “访问接口A”
8)bindService()
9)通过 “访问接口A” 调用 AIDL 类中定义好的操作请求
###2 Server端向Client端主动发起调用
客户端
1)实现待注册的Stub子类,通过“访问接口A”的注册接口,向Server端发起注册
服务端
2)在接受注册的函数中,使用RemoteCallbackList< T extends IInterface>
保存上一步中注册过来的Binder对象
3) 在 Server 端特定的位置调用 2)中的 RemoteCallbackList 获取Binder对象,通过Binder对象回调Client端的相关逻辑。
二、Binder连接池
随着AIDL的增加,我们不能无限制地增加Service,所以要把搞一个类似中间件的东西。
binder连接池原理:p113
对于每个AIDL接口,分别实现对应的Binder,统一一个service,然后每次bind service的时候,通过一个连接池来进行Binder分发,queryBinder里面通过请求的code来决定分配哪个Binder。
有了BinderPool可以大大方便日常的开发工作,比如如果有一个新的业务模块需要添加新的AIDL,那么在它实现了自己的AIDL接口后,只需要修改BinderPoolImpl中的queryBinder方法queryBinder方法,给自己添加一个新的binderCode并返回对象的Binder对象即可。
通过BinderPool的方式将Binder的控制与Service本身解耦,同时只需要维护一份Service即可。
这里用到了CountDownLatch,大概解释下用意:线程在await后等待,直到CountDownLatch的计数为0,BinderPool里使用它的目的是为了保证Activity获取BinderPool的时候Service已确定bind完成~
此处参考:https://blog.csdn.net/amurocrash/article/details/48714607