Android跨进程通信中,对Binder的不完全理解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012218652/article/details/78397556

参考文章:
http://www.jianshu.com/p/1eff5a13000d
http://www.jianshu.com/p/467016b4487c

本文需要结合上面参考文献进行理解。

两个接口

跨进程通讯中说到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进行调用)。

猜你喜欢

转载自blog.csdn.net/u012218652/article/details/78397556