(转载)http://blog.csdn.net/skypine_lee/article/details/7395801

http://home.lupaworld.com/home-space-uid-42237-do-blog-id-232429.html
远程对象的基础接口,是一个为了在执行进程中和进程间调用时的高性能,而设计的轻量级远程调用机制的核心部分。

这个接口描述了和远程对象交互的抽象协议。不要直接实现这个接口,而是通过继承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 用户指令的第一个事务码可用。 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.DeathRecipientrecipient, int flags)
  如果这个binder消失,为标志信息注册一个接收器。
  boolean pingBinder()
  检查是否这个对象还存在。
  IInterface queryLocalInterface(Stringdescriptor)
  试图获得一个对这个Binder对象的一个接口的本地实现。
  boolean transact(intcode,Parceldata, Parcelreply, int flags)
  用对象执行一个一般的操作。
  boolean unlinkToDeath(IBinder.DeathRecipientrecipient, int flags)
  清除一个之前注册的死亡标识信息。
内容
常量
public static final intDUMP_TRANSACTION
IBinder事务协议码:清除内部状态 
常量值: 1598311760 (0x5f444d50)
public static final intFIRST_CALL_TRANSACTION
用户指令的第一个事务码可用
常量值: 1 (0x00000001)
public static final intFLAG_ONEWAY
transact(int,Parcel, Parcel, int)标志符:这是一个单向调用,意味着调用者会立即返回,而不等待从被调用者那里的结果。
常量值: 1 (0x00000001)
public static final intINTERFACE_TRANSACTION
IBinder事务协议码:向事务接收端询问他的规范接口描述符。
常量值: 1598968902 (0x5f4e5446)
public static final intLAST_CALL_TRANSACTION
用户指令的最后一个事务码可用。
常量值: 16777215 (0x00ffffff)
public static final intPING_TRANSACTION
IBinder事务协议码:pingBinder(). 
常量值: 1599098439 (0x5f504e47)
公共方法
public StringgetInterfaceDescriptor()
获得被这个binder支持的接口的规范名字。
异常
RemoteException  
public booleanisBinderAlive()
检查binder所在的进程是否还是存在的。
返回值
如果进程不能在则返回假值。注意如果返回真值,进程可能在调用返回时已经死掉了。
public void linkToDeath(IBinder.DeathRecipientrecipient, int flags)
如果这个binder消失,为标志信息注册一个接收器。如果这个binder对象不正常的消失(比较典型是因为他的服务进程已经被终止)那么这个

给定的 IBinder.DeathRecipient的DeathRecipient.binderDied()方法将会被调用。
你将仅仅从远程binders那里接收到一个死亡标识信息,作为定义中的本地的binders在调用死亡前是不会死亡的。
异常
  RemoteException如果目标IBinder的进程已经死亡。
RemoteException  
请参阅
unlinkToDeath(IBinder.DeathRecipient,int)
public boolean pingBinder()
检查是否这个对象还存在。
返回值
如果服务进程已经消失则返回假值,否则结果被pingBinder()在另一边实现返回(通常默认的是真值)。
public IInterfacequeryLocalInterface(Stringdescriptor)
试图获得一个对这个Binder对象的一个接口的本地实现。如果返回NULL,你将需要去实例化一个代理类来通过transact()方法对调用编组。
public boolean transact(intcode, Parceldata, Parcelreply, 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.DeathRecipientrecipient, int flags)
清除一个之前注册的死亡标识信息。如果这个对象已经死亡,这个接收器将不再被调用。
返回值
如果接收器成功被断开连接则返回真,你必须确保他的 DeathRecipient.binderDied()方法没有被调用。如果目标IBinder已经死亡则返回假值,

意味着这个方法已经(或将要)被调用。
异常
  NoSuchElementException如果给定的接收器还没有和IBinder注册,并且这个IBinder还活着。注意如果接收器从来没有被注册过,

但是IBinder已经死亡,这个异常将不会抛出,你会接收到一个假值作为返回值。

android IBinder 解析相关推荐

  1. Android全面解析之Activity生命周期

    前言 很高兴遇见你~ 欢迎阅读我的文章. 关于Activity生命周期的文章,网络上真的很多,有很多的博客也都讲得相当不错,可见Activity的重要性是非常高的.事实上,我猜测每个android开发 ...

  2. Android混淆解析

    此文章转载来源https://www.jianshu.com/p/84114b7feb38点击打开链接 Android混淆解析 一.混淆的目的 一款发布到市场的软件原则上都应该做代码混淆. 通过代码混 ...

  3. Android中解析XML

    Android中解析XML 转载于:https://www.cnblogs.com/zhujiabin/p/5868993.html

  4. android 如何实现无限列表,在Android中解析和创建无限/无限级别的List /子列表中的XML...

    在我的Android Application的服务器端应用程序也由我开发.在这个应用程序Android应用程序从服务器请求一些XML并解析它. XML包含描述应用程序中应该有多少标签的信息,并且每个标 ...

  5. 在linux kernel或android中解析cmdline参数

    文章目录 ★★★ 友情链接 : 个人博客导读首页-点击此处 ★★★ Kernel command line: earlycon androidboot.selinux=permissive uart_ ...

  6. android最大json,Android:解析大型JSON文件

    我正在创建一个Android应用程序,该应用程序应该将Json从文件或网址解析为jsonarray和jsonobjects. 问题是,我的JSON是3.3 MB,当我使用一个简单的代码,如下所示:(现 ...

  7. android XMl 解析神奇xstream 六: 把集合list 转化为 XML文档

    前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...

  8. android XMl 解析神奇xstream 五: 把复杂对象转换成 xml ,并写入SD卡中的xml文件

    前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...

  9. android XMl 解析神奇xstream 四: 将复杂的xml文件解析为对象

    前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...

最新文章

  1. MaterialEditText 控件学习
  2. 植入“电商基因” 传统产业搭上网络快车[图]
  3. 粉色温馨——HTML框架示例
  4. Oracle 创建主键自增表
  5. Orange——The Data
  6. Python-10-条件和条件语句
  7. Socket编程实践(4) --多进程并发server
  8. 初学Docker容器网络不得不看的学习笔记
  9. Path(1)vrep中的贝塞尔点、控制点的简单区分
  10. 为什么200M宽带还是会很慢?
  11. GitHub更新Fork代码
  12. 【转】Android实例剖析笔记(二)--用实例讲解Andriod的开发过程,以NotesList为实例介绍Android的菜单机制...
  13. 变量定义与声明的区别
  14. 路由器常见故障排除及解决方法!
  15. STM32驱动W25Q64读写数据
  16. 批量 材质 调整_3dmax怎么批量修改材质
  17. zui php,ZUI前端html5框架 php版 v1.9.1
  18. JavaWeb网上书城项目
  19. 简单算法-割点和割边
  20. 金仓数据库 KingbaseES SQL 语言参考手册 (10. 查询和子查询)

热门文章

  1. Linux hdparm命令使用方法
  2. 区块链系统:公钥和地址
  3. python实现五子棋双人对弈
  4. jupyter多次运行问题
  5. 中国石油大学(华东)数据分析(Python)
  6. c++运算符重载+的三种类型
  7. 关于pytorch中CUDA的使用问题总结
  8. Lombok @Slf4j 使用和配置
  9. 测试圈相亲平台开发流程(5):首页开发
  10. Excel2010学习贴3:在2010中使用2003的颜色面板