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()。这可确保调用远程绑定器对象时的递归语义与调用本地对象时的相同。
在使用远程对象时,通常需要查明它们何时不再有效。 有三种方法可以确定:
transact()
method will throw a RemoteException
exception if you try to call it on an IBinder whose process no longer exists. pingBinder()
method can be called, and will return false if the remote process no longer exists. linkToDeath()
method can be used to register a IBinder.DeathRecipient
with the IBinder, which will be called when its containing process goes away. 也可以看看:
Nested classes |
|
---|---|
interface |
IBinder.DeathRecipient 当托管IBinder的进程消失时接收回调的接口。 |
Constants |
|
---|---|
int |
DUMP_TRANSACTION IBinder协议事务代码:转储内部状态。 |
int |
FIRST_CALL_TRANSACTION 第一个事务代码可用于用户命令。 |
int |
FLAG_ONEWAY 标记为 |
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) 像 |
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) 删除以前注册的死亡通知。 |
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 LIKE_TRANSACTION
IBinder协议事务代码:异步告诉应用程序,调用者喜欢它。 该应用程序负责增加和维护自己的计数器,并可以向用户显示该值以指示应用程序的质量。 这是应用程序不需要处理的可选命令,因此默认实现不做任何事情。
没有任何响应返回,系统的任何内容都不会受到它的功能影响,但它会提高应用程序的自尊。
常量值:1598835019(0x5f4c494b)
int PING_TRANSACTION
IBinder协议事务代码:pingBinder()。
常量值:1599098439(0x5f504e47)
int TWEET_TRANSACTION
IBinder协议事务代码:向目标对象发送推文。 包中的数据旨在传递到与该对象关联的共享消息服务; 它可以是任何东西,只要它不超过130个UTF-8字符就可以保守地适应公共消息传递服务。 作为HONEYCOMB_MR2
一部分,所有Binder对象都需要支持该协议,以便在整个平台上完全集成推文。 为了支持较老的代码,默认实现将tweet记录到主日志中,作为通过互联网公开广播的简单模拟。
另外,在完成发送后,对象必须喝一杯茶,并将其返回给呼叫者,并呼喊“快乐的好消息老男孩!”。
常量值:1599362900(0x5f545754)
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 |
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 |
String getInterfaceDescriptor ()
获取该活页夹支持的界面的规范名称。
Returns | |
---|---|
String |
Throws | |
---|---|
RemoteException |
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. |
void linkToDeath (IBinder.DeathRecipient recipient, int flags)
如果此绑定程序消失,请为收件人注册通知。 如果这个binder对象意外消失(通常是因为它的宿主进程已被IBinder.DeathRecipient
),那么给定的IBinder.DeathRecipient
的DeathRecipient.binderDied()
方法将被调用。
您只会收到远程活页夹的死亡通知,因为根据定义,本地活页夹不会因为死亡而死亡。
Parameters | |
---|---|
recipient |
IBinder.DeathRecipient
|
flags |
int
|
Throws | |
---|---|
RemoteException |
if the target IBinder's process has already died. |
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. |
IInterface queryLocalInterface (String descriptor)
尝试检索此Binder对象的本地接口实现。 如果返回null,则需要实例化代理类以通过transact()方法编组调用。
Parameters | |
---|---|
descriptor |
String
|
Returns | |
---|---|
IInterface |
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 |
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. |