Android:Parcelable/Bundle/IBinder

來源:互聯網
上載者:User

public interface

ParcelableClass Overview

Interface for classes whose instances can be written to and restored from a Parcel. Classes implementing the Parcelable interface must also have a static field called CREATOR, which is an object implementing the Parcelable.Creator interface.

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

public final class

Bundle

extends Object
implements Parcelable Cloneable A mapping from String values to various Parcelable types.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`public interface

IBinder

android.os.IBinder
Class Overview

Base interface for a remotable object, the core part of a lightweight remote procedure call mechanism designed for high performance when performing in-process and cross-process calls. This interface describes the abstract protocol for interacting with a remotable object. Do not implement this interface directly, instead extend from Binder.

The key IBinder API is transact() matched by Binder.onTransact(). These methods allow you to send a call to an IBinder object and receive a call coming in to a Binder object, respectively. This transaction API is synchronous, such that a call to transact() does not return until the target has returned from Binder.onTransact(); this is the expected behavior when calling an object that exists in the local process, and the underlying inter-process communication (IPC) mechanism ensures that these same semantics apply when going across processes.

 

作用:是遠程對象、輕量級程序呼叫機制的核心部分的基本介面。這個介面描述了與遠程對象之間進行互動的抽象協議。一般不直接實現IBinder介面,而是實現它的子類:Binder。

IBinder最重要的API是transact()對應的是Binder.onTransact().這些API都是同步的。

 

The data sent through transact() is a Parcel, a generic buffer of data that also maintains some meta-data about its contents. The meta data is used to manage IBinder object references in the buffer, so that those references can be maintained as the buffer moves across processes. This mechanism ensures that when an IBinder is written into a Parcel and sent to another process, if that other process sends a reference to that same IBinder back to the original process, then the original process will receive the same IBinder object back. These semantics allow IBinder/Binder objects to be used as a unique identity (to serve as a token or for other purposes) that can be managed across processes.

 

transcat()是通過Parcel傳送資料的,在整個進程間互動過程中,Ibinder/Binder對象是始終一致的。

 

The system maintains a pool of transaction threads in each process that it runs in. These threads are used to dispatch all IPCs coming in from other processes. For example, when an IPC is made from process A to process B, the calling thread in A blocks in transact() as it sends the transaction to process B. The next available pool thread in B receives the incoming transaction, calls Binder.onTransact() on the target object, and replies with the result Parcel. Upon receiving its result, the thread in process A returns to allow its execution to continue. In effect本質上, other processes appear to use as additional threads that you did not create executing in your own process.

 

整個IPC(處理序間通訊)的過程是這樣的:當進程A的調用線程把transaction發送給進程B之後,自身就阻塞在transact()中。進程B中的空閑線程然後接收過來的transaction,並對目標對象調用Binder.onTransact(),並用結果Parcel回複,進程A中的線程收到後,繼續從阻塞的地方開始執行。

 

The Binder system also supports recursion across processes. For example if process A performs a transaction to process B, and process B while handling that transaction calls transact() on an IBinder that is implemented in A, then the thread in A that is currently waiting for the original transaction to finish will take care of calling Binder.onTransact() on the object being called by B. This ensures that the recursion semantics when calling remote binder object are the same as when calling local objects.

 

Binder系統也支援進程間的遞迴。

 

When working with remote objects, you often want to find out when they are no longer valid. There are three ways this can be determined:

  • The transact() method will throw a RemoteException exception if you try to call it on an IBinder whose process no longer exists.
  • The pingBinder() method can be called, and will return false if the remote process no longer exists.
  • The linkToDeath() method can be used to register a IBinder.DeathRecipient with the IBinder, which will be called when its containing process goes away.

常用的成員方法:

public abstract boolean transact (int code, Parcel data, Parcel reply, int flags) Since: API Level 1

Perform a generic operation with the object.

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

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

public class

Binder

extends Object
implements IBinder

Class Overview

Base class for a remotable object, the core part of a lightweight remote procedure call mechanism defined by IBinder. This class is an implementation of IBinder that provides the standard support creating a local implementation of such an object.

Most developers will not implement this class directly, instead using the aidl tool to describe the desired interface, having it generate the appropriate Binder subclass. You can, however, derive directly from Binder to implement your own custom RPC protocol or simply instantiate a raw Binder object directly to use as a token that can be shared across processes.

 

Binder主要用於進程間的遠程通訊調用,而這些通訊的核心機制由IBinder來實現。也可以直接從Binder派生出子類,然後實現自己的RPC協議。

 

常用的成員方法:

 

protected boolean onTransact (int code, Parcel data, Parcel reply, int flags) Since: API Level 1

Default implementation is a stub that returns false. You will want to override this to do the appropriate unmarshalling of transactions.

If you want to call this, call transact().

Throws
RemoteException  

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.