android ibinder類介面編輯

2021-06-21 22:58:30 字數 1578 閱讀 8491

類目錄:android.os.ibinder

直接子類是binder

這個介面是能進行遠端操作物件的乙個基介面。定義了為在提供程序間和跨程序間的呼叫時提供高效能的輕量級遠端呼叫的核心部分。該介面描述了與遠端物件進行互動的抽象協議。

它的核心api是transact(),在它的直接子類中是binder.ontransact()。這些方法允許你分別傳送乙個呼叫到乙個ibinder物件和接收呼叫到乙個binder物件。

ibinder是什麼呢?首先要明白,android的遠端呼叫(就是跨程序呼叫)就是通過ibinder實現的,下面是對android開發文件的翻譯。

ibinder是遠端物件的基本介面,是為高效能而設計的輕量級遠端呼叫機制的核心部分。但它不僅用於遠端呼叫,也用於程序內呼叫。這個介面定義了與遠端物件互動的協議。不要直接實現這個介面,而應該從binder派生。

ibinder的主要api是transact(),與它對應另一方法是binder.ontransact()。第乙個方法使你可以向遠端的ibinder物件傳送發出呼叫,第二個方法使你自己的遠端物件能夠響應接收到的呼叫。ibinder的api都是同步執行的,比如transact()直到對方的binder.ontransact()方法呼叫完成後才返回。呼叫發生在程序內時無疑是這樣的,而在程序間時,在ipc的幫助下,也是同樣的效果。

通過transact()傳送的資料是parcel,parcel是一種一般的緩衝區,除了有資料外還帶有一些描述它內容的元資料。元資料用於管理ibinder物件的引用,這樣就能在緩衝區從乙個程序移動到另乙個程序時儲存這些引用。這樣就保證了當乙個ibinder被寫入到parcel併發送到另乙個程序中,如果另乙個程序把同乙個ibinder的引用回發到原來的程序,那麼這個原來的程序就能接收到發出的那個ibinder的引用。這種機制使ibinder和binder像唯一標誌符那樣在程序間管理。

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註冊乙個ibinder.deathrecipient,在ibinder代表的程序退出時被呼叫。

要實現ibinder來支援遠端呼叫,應從binder類派生乙個類。binder實現了ibinder介面。但是一般不需要直接實現此類,而是跟據你的需要由開發包中的工具生成,這個工具叫aidi。你通過aidi語言定義遠端物件的方法,然後用aidi工具生成binder的派生類,然後就可使用之。然而,可是,但是,當然,你也可以直接從binder類派生以實現自定義的rpc呼叫,或只是例項化乙個原始的binder物件直接作為程序間共享的令牌來使用。

類值類與類指標類

類值類 行為像值的 class a a const a a ps new string a.ps i a.i 每個類物件有自己的乙份資源拷貝 a operator const a rhs a private string ps int i 一種優化拷貝賦值運算子的方法 copy and swap c...

巢狀類 匿名類 密封類

巢狀類 在c 中可以將乙個類定義在另乙個類的內部,外部的叫外部類,內部的巢狀類 namespace 27 set public void hello 巢狀類 public class web webname,weburl class program 匿名類 如果某個類的例項物件只會使用到一次,可以使...

點類,圓類,圓柱類

print?copyright c 2012,煙台大學計算機學院 all rights reserved.檔名稱 text.cpp 作 者 胡穎 完成日期 2013年5月20日 版 本 號 v1.0 輸入描述 無 問題描述 1 先建立乙個point 點 類,包含資料成員x,y 座標點 2 以poin...