Android进阶 笔记5

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值