频道栏目
首页 > 资讯 > Android > 正文

Android跨进程通信中Binder解析

17-10-31        来源:[db:作者]  
收藏   我要投稿

Android跨进程通信中Binder解析。

两个接口

跨进程通讯中说到Binder和AIDL,就要说到最重要的两个接口:IBinder和IInterface。

Binder具有被跨进程传输的能力是因为它实现了IBinder接口。系统会为每个实现了该接口的对象提供跨进程传输。那跨进程通信时,传输数据的媒介就是实现了IBinder的实例。

有了IBinder,IInterface又有啥用呢?我个人理解:这个接口只是为了方面操作(只有一个asbinder()方法嘛)。

那aidl文件和自动生成的同名的java文件是啥?aidl就是个接口咯,重点就在那个自动生成的java文件身上。这个java文件乍一看很大很乱,其实它的作用很简单:还是方便操作(咳咳,有点官方了)。下面一段细说。

通信方式

将通信看成是进程A和进程B的通信。进程A看作客户端,进程B看作服务器,我们想的通信过程:
1. 进程A将数据传递给进程B
2. 数据在进程B中进行处理
3. 进程A获取处理后的数据
4. 完美

然而实际是这样滴:
1. 进程B中定义实现了方法的Binder
2. 进程A获取进程B的Binder
3. 进程A使用进程B的Binder来处理数据

假设A为一个Activity,B为一个Service。
A:有一个实现了IInterface的成员变量。一个ServiceConnection成员变量。ServiceConnection是用来接受从B中传过来的Binder的。
B:一个Binder成员变量(比较特别的是,这个Binder类是实现了IInterface接口的子类)。

下面来分析aidl文件同名的java的类里有啥呢:一个子类Stub(extends Binder, inplements自定义的接口),basicTypes()方法,未实现的自定义方法。

dang dang dang,这个Stub类就是上面说的传递的Binder。是不是说到这里该结束了,其实并没有。它的流程有点复杂,至于为什么这么复杂,其实我也不知道。(笑哭,以后分析)进程A获取到的Binder并不是是这个Stub,而是Stub的一个代理/替身——Proxy。

跨进程用替身(代理)

Stub里面有啥呢:asInterface()方法、asBinder()方法、onTransact()方法、Proxy类。Proxy是它的替身。asInterface是个static方法:如果两个组件进程不同,那么它返回Proxy;如果是同一进程,则返回自身。

替身套路与本身也不同,Proxy同样也实现了aidl接口中的方法,而实现方法中其实还是调B的Stub的方法(通过onTransact进行调用)。

相关TAG标签
上一篇:Android开发设计模式之迭代器模式解析
下一篇:比特币中国最新公告表示继续支持提现提币业务
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站