android開發文檔之Binder、IBinder

翻譯一定是站在理解併成功運用的基礎上的,同時重視其是否易於讀者快速理解核心內容。

下面以android應用工程師的視角進行翻譯和註解

android.os.Binder

Binder類時遠程對象的基類,是由IBinder定義的輕量級遠程程序調用機制(即進程間通信,通信即對象間相互調用彼此的函數、對象等)的核心部分。這個類是IBinder接口的實現,其中IBinder爲建立該類的實現提供了標準支持。

大部分開發者不直接實現這個類,而是使用它來生成一個合適的Binder子類,代替使用aidl工具去描述所需要的接口。然而你可以直接集成Binder去實現你自己定製的RPC(Remote Procedure Call Protocol)協議或者簡單的實例化一個用來作爲進程間共享時的標記的Binder對象。

android.os.IBinder

遠程對象的基本接口,在進程內部和進程間執行,是高性能輕量級遠程程序呼叫機制的核心部分。這個接口描述了與遠程對象互動的抽象協議。不要用直接實現這個接口的方法替代繼承Binder類。

IBinder的關鍵API是和Binder.onTransact()方法相對應的transaction()方法。這些方法分別允許你向IBinder對象發送一個調用和接收一個來自Binder對象的調用。正如transact()方法的調用直到Binder.onTransact()返回結果前不返回結果,這個事務的API是同步執行的;當調用發生在本地進程時,這個行爲是顯而易見的,當調用發生在進程間時IPC機制會保證同樣的效果。

通過transact()發送的數據時Parcel,Parcel是一種數據的通用緩存,除了數據外還帶有描述其內容的元數據。元數據被用來管理IBinder對象在緩存中的引用,這樣就能使這些引用隨緩存跨進程傳輸。這個機制確保了當一個IBinder被寫在一個Parcel中發送到另一個進程時,如果其他進程將同一個IBinder的引用發回給原進程,這時原進程將受到這個IBinder對象的引用。這種機制允許IBinder和Binder對象在跨進程管理時擁有唯一標識。

系統維持一個正在運行的程序維持一個交互線程池。這些線程被用來調度所有即將從其他進程到來的IPC調用。例如,當一個從進程A到進程B的IPC調用生成時,在這個發送事物給B的過程中,發出請求的A線程就堵塞在transact()方法中了。進程B中的交互線程池中的一個線程接收了這個調用,它調用Binder.onTransact(),完成後用一個Parcel來做爲結果返回。然後進程A中的那個等待的線程在收到返回的Parcel後得以繼續執行。實際上,另一個進程看起來就像是當前進程的一個線程,但不是當前進程創建的。

Binder機制還支持進程間的遞歸調用。例如,進程A執行自己的IBinder的transact()調用進程B的Binder,而進程B在其Binder.onTransact()中又用transact()向進程A發起調用,那麼進程A在等待它發出的調用返回的同時,還會用Binder.onTransact()響應進程B的transact()。總之Binder造成的結果就是讓我們感覺到跨進程的調用與進程內的調用沒什麼區別。

當與使用一個遠程對象時,你常常想知道他們何時會失效。這裏有三種方法:

1)transact()方法將在IBinder所在晉城不存在的時候拋出RemoteException異常。

2)如果遠程進程不存在,將回調pingBinder()方法並返回一個false。

3)linkToDeath()方法可以向IBinder註冊一個DeathRecipient方法,在IBinder所在晉城退出時回調。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章