远程对象的基础接口,是一个为了在执行进程中和进程间调用时的高性能,而设计的轻量级远程调用机制的核心部分。这个接口描述了和远程对 象交互的抽象协议。不要直接实现这个接口,而是通过继承 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,  IPackageInstallObserver.Stub,  SensorManager
请参阅

  • Binder

概要

常量

      Value  
int  DUMP_TRANSACTION  IBinder事务协议码: 清除内部状态  1598311760  0x5f444d50 
int  FIRST_CALL_TRANSACTION  用户指令的第一个事务码可用。 0x00000001 
int  FLAG_ONEWAY   transact(int, Parcel, Parcel, int)标志符: 这是一个单向调用,意味着调用者会立即返回,而不等待从被调用者那里的结果。 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)
清除一个之前注册的死亡标识信息。

内容常量

public static final int DUMP_TRANSACTION

IBinder事务协议码: 清除内部状态

常 量值:  1598311760 (0x5f444d50)

public static final int FIRST_CALL_TRANSACTION

用户指令的第一个事务码可用

常 量值:  1 (0x00000001)

public static final int FLAG_ONEWAY

transact(int, Parcel, Parcel, int)标志符:这是一个单向调用,意味着调用者会立即返回,而不等待从被调用者那里的结果。

常 量值:  1 (0x00000001)

public static final int INTERFACE_TRANSACTION

IBinder事务协议码: 向事务接收端询问他的规范接口描述符。

常 量值:  1598968902 (0x5f4e5446)

public static final int LAST_CALL_TRANSACTION

用户指令的最后一个事务码可用。

常 量值:  16777215 (0x00ffffff)

public static final int PING_TRANSACTION

IBinder事务协议码: pingBinder().

常 量值:  1599098439 (0x5f504e47)

公共方法

public  String getInterfaceDescriptor()

获得被这个binder支持的接口的规范名字。

异常

RemoteException

public boolean isBinderAlive()

检查binder所在的进程是否还是存在的。

返回值

  • 如果进程不能在则返回假值。注意如果返回真值,进程可能在调用返回时已经死掉了。

public void linkToDeath( IBinder.DeathRecipient recipient, int flags)

如果这个binder消失,为标志信息注册一个接收器。如果这 个binder对象不正常的消失(比较典型是因为他的服务进程已经被终止)那么这个给定的  IBinder.DeathRecipient的 DeathRecipient.binderDied()方 法将会被调用。

你将仅仅从远程binders那里接收到一个死亡标识信息,作为定义中的本地的binders在调用死亡前是不会死亡的。

异常

RemoteException 如果目标IBinder的进程已经死亡。
RemoteException
请参阅

  • unlinkToDeath(IBinder.DeathRecipient, int)

public boolean pingBinder()

检查是否这个对象还存在。

返回值

  • 如果服务进程已经消失则返回假值,否则结果被pingBinder()在另一边实现返回(通常默认的是真值)。

public  IInterface queryLocalInterface( String descriptor)

试图获得一个对这个Binder对象的一个接口的本地实现。如 果返回NULL,你将需要去实例化一个代理类来通过transact()方法对调用编组。
public boolean transact(int code,  Parcel data,  Parcel reply, int flags)

用对象执行一个一般的操作。

参数

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的介绍相关推荐

  1. Android IBinder的linkToDeath介绍

    先看官方解释: The linkToDeath() method can be used to register a IBinder.DeathRecipient with the IBinder, ...

  2. Android IBinder的linkToDeath介绍及情景模拟

    最近查看Framework源码的时候,读到了AudioService处理音量的流程,在这里碰到了IBinder的linkToDeath()这个知识点,比较感兴趣,所以记录下来,并自己写demo尝试了一 ...

  3. HTML中Css详细介绍

    HTML中Css详细介绍 一.样式表的作用 1.Css样式表,层叠样式表 2.类似于人类的衣服,网页的衣服 3.作用:美化网页 4.优势: 1.内容与表现分离,便于维护 2.样式丰富,页面布局灵活 3 ...

  4. Linux下使用ls查看文件颜色全部为白色的解决方法,以及Linux中文件颜色介绍

    1 解决ls查看文件爱呢颜色为白色 方法一: 1.修改~/.bashrc文件,添加如下内容 alias ls='ls --color=auto' 2.source一下,让修改配置生效 source ~ ...

  5. TF:tensorflow框架中常用函数介绍—tf.Variable()和tf.get_variable()用法及其区别

    TF:tensorflow框架中常用函数介绍-tf.Variable()和tf.get_variable()用法及其区别 目录 tensorflow框架 tensorflow.Variable()函数 ...

  6. c语言字符串加减_C语言中指针的介绍

    C语言中指针的介绍 指针是C语言中广泛使用的一种数据类型. 运用指针编程是C语言最主要的风格之一.利用指针变量可以表示各种数据结构:能很方便地使用数组和字符串: 并能象汇编语言一样处理内存地址,从而编 ...

  7. Linux中 /boot 目录介绍 【转载】

    Linux中 /boot 目录介绍 转自:点击打开链接 一./boot/目录中的文件和目录 Linux系统在本地启动时,目录/boot/非常重要,其中的文件和目录有: (1)系统Kernel的配置文件 ...

  8. 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 ...

  9. 03_MyBatis基本查询,mapper文件的定义,测试代码的编写,resultMap配置返回值,sql片段配置,select标签标签中的内容介绍,配置使用二级缓存,使用别名的数据类型,条件查询ma

     1 PersonTestMapper.xml中的内容如下: <?xmlversion="1.0"encoding="UTF-8"?> < ...

最新文章

  1. 【每日一算法】最后一个单词的长度
  2. java中自造类是什么意思_Java建造者模式是什么?如何实现?(附代码)
  3. c++调用shell命令
  4. l2_norm opencv torch比较
  5. 视频编码中常用熵编码介绍
  6. Go 语言简介(上)— 语法
  7. 认证概述散列函数数字签名
  8. 重庆计算机学校电话号码,重庆计算机学校
  9. python内置序列类型_Python序列内置类型之元组类型详解
  10. 让评审人爱上你的8个要点
  11. Leet Code OJ 4. Median of Two Sorted Arrays [Difficulty: Hard]
  12. win7下 apache2.2 +php5.4 环境搭建
  13. mysql两列取小_mysql – 我想获取两列特定列之间的列值
  14. moore和mealy_Mealy机和Moore机的比较研究 目录
  15. 什么是HOOK功能?
  16. JavaScript-12(脚本化CSS)
  17. SharePoint 关于拓扑错误的解决方案
  18. MySQL数据库储存引擎Inoodb一--记录储存结构
  19. html编写在线打字通,HTML5代码打字练习、HTML5案例 - 03
  20. 破解百词斩单词数据之旅

热门文章

  1. 安科瑞数据中心行业电能质量监测与治理方案-李亚俊
  2. 递归实现二叉树的前序遍历
  3. java image转换icon_内存转换Image到Icon
  4. matlab扩充内存,matlab中内存不够用的解决方案
  5. Tickeys -- 找对打字的感觉 (机械键盘音效软件)
  6. 您的云,您做主:Google Distributed Cloud Hosted 全面可用
  7. C语言实现Prim算法与Kruskal算法(浙大 陈越版)
  8. PHP面试高频算法面试题 -- 判断链表是否有环
  9. 语法制导翻译和中间代码生成
  10. 排序法学习之插入排序(python3实现)