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

请参阅

概要

常量

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

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已经死亡,这个异常将不会抛出,你会接收到一个假值作为返回值。

IBinder类的中文翻译的更多相关文章

  1. 《Entity Framework 6 Recipes》中文翻译系列 目录篇 -持续更新

    为了方便大家的阅读和学习,也是响应网友的建议,在这里为这个系列做一个目录.在目录开始这前,我先来回答之前遇到的几个问题. 1.为什么要学习EF? 这个问题很简单,项目需要.这不像学校,没人强迫你学习! ...

  2. Spark官方文档 - 中文翻译

    Spark官方文档 - 中文翻译 Spark版本:1.6.0 转载请注明出处:http://www.cnblogs.com/BYRans/ 1 概述(Overview) 2 引入Spark(Linki ...

  3. Spark SQL 官方文档-中文翻译

    Spark SQL 官方文档-中文翻译 Spark版本:Spark 1.5.2 转载请注明出处:http://www.cnblogs.com/BYRans/ 1 概述(Overview) 2 Data ...

  4. 苹果App Store审核指南中文翻译(2014.9.1更新)

    转:http://www.cocoachina.com/appstore/20140901/9500.html CocoaChina对<苹果应用商店审核指南>中文翻译最近一次更新时间为20 ...

  5. 《Introduction to Tornado》中文翻译计划——第五章:异步Web服务

    http://www.pythoner.com/294.html 本文为<Introduction to Tornado>中文翻译,将在https://github.com/alioth3 ...

  6. Objective-C 编程艺术 (Zen and the Art of the Objective-C Craftsmanship 中文翻译)

    # 禅与 Objective-C 编程艺术 (Zen and the Art of the Objective-C Craftsmanship 中文翻译) - 原文 <https://githu ...

  7. 《Django By Example》第九章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者@ucag 注:哈哈哈,第九章终于来啦 ...

  8. 【转】苹果App Store审核指南中文翻译(更新)

    (注:<苹果应用商店审核指南>中文翻译最近一次更新为2013-03-04,文中红色部分是相对于2013-03-04版本的新增内容,绿色部分代表更改的内容,蓝色表示苹果相关官方文档的链接.) ...

  9. Next.js v4.1.4 文档中文翻译【转载】

    最近想稍稍看下 React的 SSR框架 Next.js,因为不想看二手资料, 所以自己跑到 Github上看,Next.js的文档是英文的,看倒是大概也能看得懂, 但有些地方不太确定,而且英文看着毕 ...

随机推荐

  1. 在masterpage中添加对usercontrol的引用

    在masterpage中添加对usercontrol的引用的方式: <%@ Register Src="/_controltemplates/15/Excellent Employee ...

  2. SSIS结合BCP及SQL Server作业实现定时将数据导出打包实现数据同步

    首先这个流程要实现的功能大致是: 有两台服务器,一台是对外网开发的,一台是内网的.那么很明显数据交互都是外网服务器在做,而这个流程要做的就是要将外网上面的数据定时同步到内网中. 我们依对其中某张表的操 ...

  3. 学习笔记_Java_day14—编码实战___一个注册页面的完整流程

  4. Codevs 1800 假面舞会 2008年NOI全国竞赛

    1800 假面舞会 2008年NOI全国竞赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 一年一度的假面舞会又开始了,栋栋也 ...

  5. caffe源码阅读(3)-Datalayer

    DataLayer是把数据从文件导入到网络的层,从网络定义prototxt文件可以看一下数据层定义 layer { name: "data" type: "Data&qu ...

  6. bzoj4330:JSOI2012 爱之项链

    题目大意:一串项链由n个戒指组成,对于每个戒指,一共有M个点,R种颜色,且旋转后相同的戒指是相同的,然后一串项链又由N个戒指组成,同时要满足相邻的两个戒指不能相同,这串项链上某个位置插入了一个特殊的东 ...

  7. 模板:优先队列(priority_queue)

    #include <iostream> #include <cstdio> #include <queue> #include <vector> usi ...

  8. (转)IOS学习笔记-2015-03-29 int、long、long long取值范围

    unsigned - - unsigned - - unsigned __int64的最大值: __int64的最小值:- unsigned __int64的最大值:  

  9. 如何通过CSS让DIV居中对齐

    给Div对应的CSS的添加如下设定即可: MARGIN-RIGHT: auto; MARGIN-LEFT: auto;

  10. MySQL配置文件详解

    MYSQL 配置文件详解 “全局缓存”.“线程缓存”,全局缓存是所有线程共享,线程缓存是每个线程连接上数据时创建一个线程(如果没有设置线程池),假如有200连接.那就是200个线程,如果参数设定值是1 ...