Most visited

Recently visited

Added in API level 1

IBinder

public interface IBinder

android.os.IBinder
Known Indirect Subclasses


可远程对象的基础接口,轻量级远程过程调用机制的核心部分,专为执行进程内和跨进程调用时的高性能而设计。 该接口描述了与可远程对象交互的抽象协议。 不要直接实现此接口,而是从Binder扩展。

关键的IBinder API是transact()Binder.onTransact()匹配。 这些方法允许您将调用发送到IBinder对象,并分别接收进入Binder对象的调用。 本次交易API是同步的,这样一个呼叫transact()不返回,直到目标已经从返回Binder.onTransact() ; 这是调用本地进程中存在的对象时的预期行为,并且基础进程间通信(IPC)机制可确保在跨进程时应用这些相同的语义。

通过transact()发送的数据是一个Parcel ,一个通用的数据缓冲区,它也维护一些关于其内容的元数据。 元数据用于管理缓冲区中的IBinder对象引用,以便可以在缓冲区跨进程移动时维护这些引用。 这种机制可以确保当一个IBinder被写入一个Parcel并发送给另一个进程时,如果该另一个进程将对该同一个IBinder的引用发送回原始进程,那么原始进程将返回相同的IBinder对象。 这些语义允许将IBinder / Binder对象用作可跨进程管理的唯一身份(用作令牌或用于其他目的)。

系统在其运行的每个进程中维护一个事务线程池。这些线程用于分派来自其他进程的所有IPC。 例如,当一个IPC从进程A创建到进程B时,当它将事务发送给进程B时,A中的调用线程在进程()中阻塞。B中的下一个可用的线程接收传入的事务,调用Binder.onTransact ()在目标对象上,并用结果Parcel答复。 在收到结果后,进程A中的线程返回以允许其执行继续。 实际上,其他进程似乎用作您在自己的进程中未创建执行的其他线程。

Binder系统还支持跨进程的递归。 例如,如果进程A对进程B执行一个事务,并且在处理该事务时进程B调用在A中实现的IBinder上的transact(),那么当前正在等待原始事务完成的A中的线程将会照顾对由B调用的对象调用Binder.onTransact()。这可确保调用远程绑定器对象时的递归语义与调用本地对象时的相同。

在使用远程对象时,通常需要查明它们何时不再有效。 有三种方法可以确定:

也可以看看:

Summary

Nested classes

interface IBinder.DeathRecipient

当托管IBinder的进程消失时接收回调的接口。

Constants

int DUMP_TRANSACTION

IBinder协议事务代码:转储内部状态。

int FIRST_CALL_TRANSACTION

第一个事务代码可用于用户命令。

int FLAG_ONEWAY

标记为 transact(int, Parcel, Parcel, int) :这是一个单向呼叫,这意味着呼叫者立即返回,而不等待被叫方的结果。

int INTERFACE_TRANSACTION

IBinder协议事务代码:询问事务的接收方其标准接口描述符。

int LAST_CALL_TRANSACTION

用于用户命令的最后一个事务代码。

int LIKE_TRANSACTION

IBinder协议事务代码:异步告诉应用程序,调用者喜欢它。

int PING_TRANSACTION

IBinder协议事务代码:pingBinder()。

int TWEET_TRANSACTION

IBinder协议事务代码:向目标对象发送推文。

Public methods

abstract void dump(FileDescriptor fd, String[] args)

将对象的状态打印到给定的流中。

abstract void dumpAsync(FileDescriptor fd, String[] args)

dump(FileDescriptor, String[])一样,但始终是异步执行的。

abstract String getInterfaceDescriptor()

获取该活页夹支持的界面的规范名称。

abstract boolean isBinderAlive()

检查绑定器所在的进程是否仍然存在。

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

如果此绑定程序消失,请为收件人注册通知。

abstract boolean pingBinder()

检查对象是否仍然存在。

abstract IInterface queryLocalInterface(String descriptor)

尝试检索此Binder对象的本地接口实现。

abstract boolean transact(int code, Parcel data, Parcel reply, int flags)

使用对象执行通用操作。

abstract boolean unlinkToDeath(IBinder.DeathRecipient recipient, int flags)

删除以前注册的死亡通知。

Constants

DUMP_TRANSACTION

Added in API level 1
int DUMP_TRANSACTION

IBinder协议事务代码:转储内部状态。

常量值:1598311760(0x5f444d50)

FIRST_CALL_TRANSACTION

Added in API level 1
int FIRST_CALL_TRANSACTION

第一个事务代码可用于用户命令。

常数值:1(0x00000001)

FLAG_ONEWAY

Added in API level 1
int FLAG_ONEWAY

标记为transact(int, Parcel, Parcel, int) :这是一个单向调用,这意味着调用者立即返回,而不必等待被调用者的结果。 仅在调用者和被调用者处于不同的进程时适用。

常数值:1(0x00000001)

INTERFACE_TRANSACTION

Added in API level 1
int INTERFACE_TRANSACTION

IBinder协议事务代码:询问事务的接收方其标准接口描述符。

常量值:1598968902(0x5f4e5446)

LAST_CALL_TRANSACTION

Added in API level 1
int LAST_CALL_TRANSACTION

用于用户命令的最后一个事务代码。

常量值:16777215(0x00ffffff)

LIKE_TRANSACTION

Added in API level 15
int LIKE_TRANSACTION

IBinder协议事务代码:异步告诉应用程序,调用者喜欢它。 该应用程序负责增加和维护自己的计数器,并可以向用户显示该值以指示应用程序的质量。 这是应用程序不需要处理的可选命令,因此默认实现不做任何事情。

没有任何响应返回,系统的任何内容都不会受到它的功能影响,但它会提高应用程序的自尊。

常量值:1598835019(0x5f4c494b)

PING_TRANSACTION

Added in API level 1
int PING_TRANSACTION

IBinder协议事务代码:pingBinder()。

常量值:1599098439(0x5f504e47)

TWEET_TRANSACTION

Added in API level 13
int TWEET_TRANSACTION

IBinder协议事务代码:向目标对象发送推文。 包中的数据旨在传递到与该对象关联的共享消息服务; 它可以是任何东西,只要它不超过130个UTF-8字符就可以保守地适应公共消息传递服务。 作为HONEYCOMB_MR2一部分,所有Binder对象都需要支持该协议,以便在整个平台上完全集成推文。 为了支持较老的代码,默认实现将tweet记录到主日志中,作为通过互联网公开广播的简单模拟。

另外,在完成发送后,对象必须喝一杯茶,并将其返回给呼叫者,并呼喊“快乐的好消息老男孩!”。

常量值:1599362900(0x5f545754)

Public methods

dump

Added in API level 3
void dump (FileDescriptor fd, 
                String[] args)

将对象的状态打印到给定的流中。

Parameters
fd FileDescriptor: The raw file descriptor that the dump is being sent to.
args String: additional arguments to the dump request.
Throws
RemoteException

dumpAsync

Added in API level 13
void dumpAsync (FileDescriptor fd, 
                String[] args)

dump(FileDescriptor, String[])一样,但总是异步执行。 如果该对象是本地的,则会创建一个新线程来执行转储。

Parameters
fd FileDescriptor: The raw file descriptor that the dump is being sent to.
args String: additional arguments to the dump request.
Throws
RemoteException

getInterfaceDescriptor

Added in API level 1
String getInterfaceDescriptor ()

获取该活页夹支持的界面的规范名称。

Returns
String
Throws
RemoteException

isBinderAlive

Added in API level 1
boolean isBinderAlive ()

检查绑定器所在的进程是否仍然存在。

Returns
boolean false if the process is not alive. Note that if it returns true, the process may have died while the call is returning.

linkToDeath

Added in API level 1
void linkToDeath (IBinder.DeathRecipient recipient, 
                int flags)

如果此绑定程序消失,请为收件人注册通知。 如果这个binder对象意外消失(通常是因为它的宿主进程已被IBinder.DeathRecipient ),那么给定的IBinder.DeathRecipientDeathRecipient.binderDied()方法将被调用。

您只会收到远程活页夹的死亡通知,因为根据定义,本地活页夹不会因为死亡而死亡。

Parameters
recipient IBinder.DeathRecipient
flags int
Throws
RemoteException if the target IBinder's process has already died.

也可以看看:

pingBinder

Added in API level 1
boolean pingBinder ()

检查对象是否仍然存在。

Returns
boolean Returns false if the hosting process is gone, otherwise the result (always by default true) returned by the pingBinder() implementation on the other side.

queryLocalInterface

Added in API level 1
IInterface queryLocalInterface (String descriptor)

尝试检索此Binder对象的本地接口实现。 如果返回null,则需要实例化代理类以通过transact()方法编组调用。

Parameters
descriptor String
Returns
IInterface

transact

Added in API level 1
boolean transact (int code, 
                Parcel data, 
                Parcel reply, 
                int flags)

使用对象执行通用操作。

Parameters
code int: The action to perform. This should be a number between FIRST_CALL_TRANSACTION and LAST_CALL_TRANSACTION.
data Parcel: Marshalled data to send to the target. Must not be null. If you are not sending any data, you must create an empty Parcel that is given here.
reply Parcel: Marshalled data to be received from the target. May be null if you are not interested in the return value.
flags int: Additional operation flags. Either 0 for a normal RPC, or FLAG_ONEWAY for a one-way RPC.
Returns
boolean
Throws
RemoteException

unlinkToDeath

Added in API level 1
boolean unlinkToDeath (IBinder.DeathRecipient recipient, 
                int flags)

删除以前注册的死亡通知。 如果该对象死亡,则不再调用接收者。

Parameters
recipient IBinder.DeathRecipient
flags int
Returns
boolean true if the recipient is successfully unlinked, assuring you that its DeathRecipient.binderDied() method will not be called; false if the target IBinder has already died, meaning the method has been (or soon will be) called.
Throws
NoSuchElementException if the given recipient has not been registered with the IBinder, and the IBinder is still alive. Note that if the recipient was never registered, but the IBinder has already died, then this exception will not be thrown, and you will receive a false return value instead.

Hooray!