IBinder中linkToDeath的介绍
远程对象的基础接口,是一个为了在执行进程中和进程间调用时的高性能,而设计的轻量级远程调用机制的核心部分。这个接口描述了和远程对 象交互的抽象协议。不要直接实现这个接口,而是通过继承 Binder来 实现。
IBinder的关键API是与 Binder.onTransact() 相匹配的transact() .这个方法分别允许你给IBinder对象发出一个请求,并接收一个进入一个Binder对象的请求。这个事务API是同步的,这样一个对transact() 的调用会在目标从Binder.onTransact()返 回后自己才能返回;这是在调用一个存在于本地进程对象的预期行为,并且潜在的IPC(进程间通信机制)也在进程间切换时确保这些相同语义得到应用。
通过transact()送出的数据是一个 Parcel, 一个通常的数据缓冲器,并且包含一些关于他内容的元数据。这些元数据用来在缓冲期内管理IBinder对象的引用,以至于那些引用可以在缓冲器穿越进程时 被包含进来。这个机制可以确保了当一个IBinder被写入一个Parcel被传送给其他进程时,如果其他进程返回给原先进程同样的IBinder引用, 原 先的进程接收同样的IBinder对象。这些语义允许IBinder/Binder对象被用作进程间切换时管理的唯一的身份(作为一个标志或其他目的来服 务)。
系统在每一个事务线程运行的进程里维护了一个事务线程池。这些线程用来分发所有来自其他进程的IPCs。例如,当一个IPC从A进程到 B进程被建立,在A里的调用线程用transact()向进程B发出一个事务。在B中下一个有效的线程池接收到进入的事务,对目标对象调用 Binder.onTransact(),并且用结果Parcel回复。在接收到结果时,在进程A中的线程返回以允许进程继续执行。效果上,其他进程看起 来象作为那些你没有在自己进程中创建执行的额外线程而使用的。
Binder系统也支持进程间的递归调用。例如,如果进程A执行一个到进程B的事务,并且进程B在处理这个事务时对一个在A里实现的 IBinder调用transact(),然后在A里的正在等待原先事务结束的线程,将会关心对被B调用的对象调用Binder.onTransact ().这个就确保在调用远程binder对象时的递归语义和调用本地对象时是一样的。
当和远程对象打交道时,你经常想要找出何时他们不再有效。下面有三条可以被确定的方式:
- 当你试图对一个所属进程已经不存在的IBinder调用transact() 方法时,会抛出一个RemoteException 异常。
- pingBinder() 可以被调用,并且如果远程进程不再存在会返回假。
- linkToDeath() 方法可以用来用这个IBinder注册一个 IBinder.DeathRecipient , 当他包含的进程消失的时候被调用。
嵌套类
IBinder.DeathRecipient | 当服务一个 IBinder的进程消失后接收一个回调的接口。 |
了解间接子类
- Binder
概要
Value | ||||
---|---|---|---|---|
int | DUMP_TRANSACTION | IBinder事务协议码: 清除内部状态 | 1598311760 | 0x5f444d50 |
int | FIRST_CALL_TRANSACTION | 用户指令的第一个事务码可用。 | 1 | 0x00000001 |
int | FLAG_ONEWAY | transact(int, Parcel, Parcel, int)标志符: 这是一个单向调用,意味着调用者会立即返回,而不等待从被调用者那里的结果。 | 1 | 0x00000001 |
int | INTERFACE_TRANSACTION | IBinder事务协议码: 向事务接收端询问他的规范接口描述符。 | 1598968902 | 0x5f4e5446 |
int | LAST_CALL_TRANSACTION | 用户指令的最后一个事务码可用。 | 16777215 | 0x00ffffff |
int | PING_TRANSACTION | IBinder事务协议码: pingBinder(). | 1599098439 | 0x5f504e47 |
公共方法
String | getInterfaceDescriptor() | |||||
获得被这个binder支持的接口的规范名字。 | ||||||
boolean | isBinderAlive() | |||||
检查binder所在的进程是否还是存在的。 | ||||||
void | linkToDeath(IBinder.DeathRecipient recipient, int flags) | |||||
如果这个binder消失,为标志信息注册一个接收器。 | ||||||
boolean | pingBinder() | |||||
检查是否这个对象还存在。 | ||||||
IInterface | queryLocalInterface(String descriptor) | |||||
试图获得一个对这个Binder对象的一个接口的本地实 现。 | ||||||
boolean | transact(int code, Parcel data, Parcel reply, int flags) | |||||
用对象执行一个一般的操作。 | ||||||
boolean | unlinkToDeath(IBinder.DeathRecipient recipient, int flags) | |||||
清除一个之前注册的死亡标识信息。 |
内容常量
公共方法
RemoteException |
---|
- 如果进程不能在则返回假值。注意如果返回真值,进程可能在调用返回时已经死掉了。
你将仅仅从远程binders那里接收到一个死亡标识信息,作为定义中的本地的binders在调用死亡前是不会死亡的。
RemoteException 如果目标IBinder的进程已经死亡。 | |
RemoteException |
- unlinkToDeath(IBinder.DeathRecipient, int)
- 如果服务进程已经消失则返回假值,否则结果被pingBinder()在另一边实现返回(通常默认的是真值)。
code | 执行的行为. 这将会是一个在 FIRST_CALL_TRANSACTION 和 LAST_CALL_TRANSACTION之 间的数字。 |
---|---|
data | 发送给目标的编组后的数据,通常不是null。如果你不传送任何数据,你必须在创建一个空的Parcel放在这里。 |
reply | 来自目标被接收的编组后的数据。如果你对返回值不感兴趣可能返回null。 |
flags | 额外的操作符。0是通常意义的RPC,或者 FLAG_ONEWAY 表示一个单向RPC. |
RemoteException |
---|
public boolean unlinkToDeath( IBinder.DeathRecipient recipient, int flags) 清除一个之前注册的死亡标识信息。如果这个对象已经死亡,这个 接收器将不再被调用。
- 如果接收器成功被断开连接则返回真,你必须确保他的 DeathRecipient.binderDied() 方法没有被调用。如果目标IBinder已经死亡则返回假值,意味着这个方法已经(或将要)被调用。
异常
NoSuchElementException 如果给定的接收器还没有和IBinder注册,并且这个IBinder还活着。注意如果接收器从来没有被注册过,但是IBinder已经死亡,这个异常将 不会抛出,你会接收到一个假值作为返回值。 |
IBinder中linkToDeath的介绍相关推荐
- Android IBinder的linkToDeath介绍
先看官方解释: The linkToDeath() method can be used to register a IBinder.DeathRecipient with the IBinder, ...
- Android IBinder的linkToDeath介绍及情景模拟
最近查看Framework源码的时候,读到了AudioService处理音量的流程,在这里碰到了IBinder的linkToDeath()这个知识点,比较感兴趣,所以记录下来,并自己写demo尝试了一 ...
- HTML中Css详细介绍
HTML中Css详细介绍 一.样式表的作用 1.Css样式表,层叠样式表 2.类似于人类的衣服,网页的衣服 3.作用:美化网页 4.优势: 1.内容与表现分离,便于维护 2.样式丰富,页面布局灵活 3 ...
- Linux下使用ls查看文件颜色全部为白色的解决方法,以及Linux中文件颜色介绍
1 解决ls查看文件爱呢颜色为白色 方法一: 1.修改~/.bashrc文件,添加如下内容 alias ls='ls --color=auto' 2.source一下,让修改配置生效 source ~ ...
- TF:tensorflow框架中常用函数介绍—tf.Variable()和tf.get_variable()用法及其区别
TF:tensorflow框架中常用函数介绍-tf.Variable()和tf.get_variable()用法及其区别 目录 tensorflow框架 tensorflow.Variable()函数 ...
- c语言字符串加减_C语言中指针的介绍
C语言中指针的介绍 指针是C语言中广泛使用的一种数据类型. 运用指针编程是C语言最主要的风格之一.利用指针变量可以表示各种数据结构:能很方便地使用数组和字符串: 并能象汇编语言一样处理内存地址,从而编 ...
- Linux中 /boot 目录介绍 【转载】
Linux中 /boot 目录介绍 转自:点击打开链接 一./boot/目录中的文件和目录 Linux系统在本地启动时,目录/boot/非常重要,其中的文件和目录有: (1)系统Kernel的配置文件 ...
- 6.支持向量机(SVM)、什么是SVM、支持向量机基本原理与思想、基本原理、课程中关于SVM介绍
6.支持向量机(SVM) 6.1.什么是SVM 6.2.支持向量机基本原理与思想 6.2.1.支持向量机 6.2.2.基本原理 6.3.课程中关于SVM介绍 6.支持向量机(SVM) 6.1.什么是S ...
- 03_MyBatis基本查询,mapper文件的定义,测试代码的编写,resultMap配置返回值,sql片段配置,select标签标签中的内容介绍,配置使用二级缓存,使用别名的数据类型,条件查询ma
1 PersonTestMapper.xml中的内容如下: <?xmlversion="1.0"encoding="UTF-8"?> < ...
最新文章
- 【每日一算法】最后一个单词的长度
- java中自造类是什么意思_Java建造者模式是什么?如何实现?(附代码)
- c++调用shell命令
- l2_norm opencv torch比较
- 视频编码中常用熵编码介绍
- Go 语言简介(上)— 语法
- 认证概述散列函数数字签名
- 重庆计算机学校电话号码,重庆计算机学校
- python内置序列类型_Python序列内置类型之元组类型详解
- 让评审人爱上你的8个要点
- Leet Code OJ 4. Median of Two Sorted Arrays [Difficulty: Hard]
- win7下 apache2.2 +php5.4 环境搭建
- mysql两列取小_mysql – 我想获取两列特定列之间的列值
- moore和mealy_Mealy机和Moore机的比较研究 目录
- 什么是HOOK功能?
- JavaScript-12(脚本化CSS)
- SharePoint 关于拓扑错误的解决方案
- MySQL数据库储存引擎Inoodb一--记录储存结构
- html编写在线打字通,HTML5代码打字练习、HTML5案例 - 03
- 破解百词斩单词数据之旅