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 的引用

这种机制使 IBinderBinder 像唯一标志符那样在进程间管理

当操作远程对象时,可能需要查看它们是否有效,有三种方法可以使用

  1. transact() 方法将在 IBinder 所在的进程不存在时抛出 RemoteException 异常
  2. 如果目标进程不存在,那么调用 pingBinder() 时返回 false
  3. 可以用 linkToDeath() 方法向 IBinder 注册一个 IBinder.DeathRecipient, 在 `IBinder 代表的进程退出时被调用

Binder

Binder 机制由一系列系统组件构成: Client、Server、Service Manager 和 Binder 驱动程序

调用流程如下

为什么是 Binder ?

Binder 机制给我们带来的最直接的好处就是

无需关心底层如何实现,只需按照 AIDL 的规则,自定义一个接口文件, 然后调用调用接口中的方法,就可以完成两个进程间的通信了

Android 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.