Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2929400
  • 博文数量: 401
  • 博客积分: 12926
  • 博客等级: 上将
  • 技术积分: 4588
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-22 14:51
文章分类

全部博文(401)

文章存档

2015年(16)

2014年(4)

2013年(12)

2012年(82)

2011年(98)

2010年(112)

2009年(77)

分类: 嵌入式

2012-07-19 23:25:39

 远程对象的基础接口,是一个为了在执行进程中和进程间调用时的高性能,而设计的轻量级远程调用机制的核心部分。这个接口描述了和远程对 象交互的抽象协议。不要直接实现这个接口,而是通过继承 来 实现。

IBinder的关键API是与  相匹配的 .这个方法分别允许你给IBinder对象发出一个请求,并接收一个进入一个Binder对象的请求。这个事务API是同步的,这样一个对 的调用会在目标从返 回后自己才能返回;这是在调用一个存在于本地进程对象的预期行为,并且潜在的IPC(进程间通信机制)也在进程间切换时确保这些相同语义得到应用。  

通过transact()送出的数据是一个 , 一个通常的数据缓冲器,并且包含一些关于他内容的元数据。这些元数据用来在缓冲期内管理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调用 方法时,会抛出一个 异常。
  •  可以被调用,并且如果远程进程不再存在会返回假。
  •   方法可以用来用这个IBinder注册一个  , 当他包含的进程消失的时候被调用。
 嵌套类
当服务一个 IBinder的进程消失后接收一个回调的接口。
 了解间接子类
, , 
请参阅
概要
常量
   Value 
int  IBinder事务协议码: 清除内部状态 1598311760 0x5f444d50 
int  用户指令的第一个事务码可用。0x00000001 
int   标志符: 这是一个单向调用,意味着调用者会立即返回,而不等待从被调用者那里的结果。0x00000001 
int  IBinder事务协议码: 向事务接收端询问他的规范接口描述符。1598968902 0x5f4e5446 
int  用户指令的最后一个事务码可用。16777215 0x00ffffff 
int  IBinder事务协议码: pingBinder(). 1599098439 0x5f504e47 
公共方法
      ()

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

检查binder所在的进程是否还是存在的。
     void ( recipient, int flags)

如果这个binder消失,为标志信息注册一个接收器。
     boolean ()

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

试图获得一个对这个Binder对象的一个接口的本地实 现。
     boolean (int code,  data,  reply, int flags)

用对象执行一个一般的操作。
     boolean ( 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
标志符:这是一个单向调用,意味着调用者会立即返回,而不等待从被调用者那里的结果。
常 量值: 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  getInterfaceDescriptor()
获得被这个binder支持的接口的规范名字。
异常

public boolean isBinderAlive()
检查binder所在的进程是否还是存在的。
返回值
  • 如果进程不能在则返回假值。注意如果返回真值,进程可能在调用返回时已经死掉了。
public void linkToDeath( recipient, int flags)
如果这个binder消失,为标志信息注册一个接收器。如果这 个binder对象不正常的消失(比较典型是因为他的服务进程已经被终止)那么这个给定的 的方 法将会被调用。

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

异常

 如果目标IBinder的进程已经死亡。

请参阅
public boolean pingBinder()
检查是否这个对象还存在。
返回值
  • 如果服务进程已经消失则返回假值,否则结果被pingBinder()在另一边实现返回(通常默认的是真值)。
public  queryLocalInterface( descriptor)
试图获得一个对这个Binder对象的一个接口的本地实现。如 果返回NULL,你将需要去实例化一个代理类来通过transact()方法对调用编组。
public boolean transact(int code,  data,  reply, int flags)
用对象执行一个一般的操作。
参数
code执行的行为. 这将会是一个在  和 之 间的数字。
data发送给目标的编组后的数据,通常不是null。如果你不传送任何数据,你必须在创建一个空的Parcel放在这里。
reply来自目标被接收的编组后的数据。如果你对返回值不感兴趣可能返回null。
flags额外的操作符。0是通常意义的RPC,或者  表示一个单向RPC.
异常

public boolean unlinkToDeath( recipient, int flags)清除一个之前注册的死亡标识信息。如果这个对象已经死亡,这个 接收器将不再被调用。
返回值
  • 如果接收器成功被断开连接则返回真,你必须确保他的  方法没有被调用。如果目标IBinder已经死亡则返回假值,意味着这个方法已经(或将要)被调用。
异常

 如果给定的接收器还没有和IBinder注册,并且这个IBinder还活着。注意如果接收器从来没有被注册过,但是IBinder已经死亡,这个异常将 不会抛出,你会接收到一个假值作为返回值。
阅读(6442) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~