Android IBinder
IBinder 是远程对象的基本接口,是为了高性能而设计的轻量级远程调用机制的核心部分
IBinder 不仅仅用于远程调用,也可用于进程内调用
IBinder 接口定义了与远程对象间交互的协议,一般情况下我们不直接实现这个接口,而是 继承 (extends) Binder
IBinder 主要的API是 transact()
,与之对应的 API 是 Binder.onTransact()
前者可以向远程 IBinder
对象发送发出调用,后者可以让远程对象响应接收到的调用
IBinder 的 API 都是 Syncronous(同步)
执行的,比如 transact()
直到对方的 Binder.onTransact()
方法调用玩后才返回
transact()
发送的数据是 Parcel ,Parcel 是一种一般的缓冲区,除了有数据外还带有
一些描述它内容的元数据
元数据用于管理 IBinder
对象的引用,这样就能在缓冲区从一个进程移动
到另一个进程时保存这些引用
保证了当一个 IBinder
被写入到 Parcel
并发送到另一个进程中,
如果另一个进程把同一个 IBinder
的引用回发到原来的进程,那么这个原来的进程就能接收到发出的
那个 IBinder
的引用
这种机制使 IBinder
和 Binder
像唯一标志符那样在进程间管理
当操作远程对象时,可能需要查看它们是否有效,有三种方法可以使用
transact()
方法将在IBinder
所在的进程不存在时抛出RemoteException
异常- 如果目标进程不存在,那么调用
pingBinder()
时返回false
- 可以用
linkToDeath()
方法向IBinder
注册一个IBinder.DeathRecipient
, 在`IBinder
代表的进程退出时被调用
Binder
Binder 机制由一系列系统组件构成: Client、Server、Service Manager 和 Binder 驱动程序
调用流程如下
为什么是 Binder ?
Binder 机制给我们带来的最直接的好处就是
无需关心底层如何实现,只需按照 AIDL 的规则,自定义一个接口文件, 然后调用调用接口中的方法,就可以完成两个进程间的通信了