IPC機制中的IBinder詳情

2022-09-23 15:12:09 字數 1558 閱讀 6347

談transact 和ontransact需要先聊聊ibinder

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像唯一標誌符那樣在程序間管理。系統為每個程序維護乙個存放互動執行緒的執行緒池。這些互動執行緒用於派送所有從另外程序發來的ipc呼叫。例如:當乙個ipc從程序a發到程序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註冊乙個ibinder.deathrecipient,在ibinder代表的程序退出時被呼叫。要實現ibinder來支援遠端呼叫,應從binder類派生乙個類。binder實現了ibinder介面。但是一般不需要直接實現此類,而是跟據你的需要由開發包中的工具生成,這個工具叫aidl。你通過aidl語言定義遠端物件的方法,然後用aidl工具生成binder的派生類,然後就可使用之。然而,可是,但是,當然,你也可以直接從binder類派生以實現自定義的rpc呼叫,或只是例項化乙個原始的binder物件直接作為程序間共享的令牌來使用。

RTT的IPC機制篇 IPC通訊總結

總結1 rtt通訊方式總結 2018年12月29日 10 47 ipc inter process communication 1,rtt的通訊機制 訊息佇列 郵箱 訊號量 互斥量 事件。2.我又按照其傳輸的內容分為 資料類和非資料類通訊。非資料類,執行緒間 執行緒與中斷傳輸非資料類資訊,實現執行緒...

程序的通訊機制(IPC)

管道是指用於連線乙個讀程序和乙個寫程序以實現他們之間進行通訊的共享檔案。管道機制必須提供以下三方面的協調能力 互斥 同步 和確定對方存在 管道操作,只能採用半雙工通訊,即某一時刻只能單向傳輸。要實現父子雙方之間相互通訊,則要定義兩個管道。下面則是實現的父子雙方使用管道進行通訊的例項 include ...

Discuz X中SESSION機制例項詳解

在discuz x中一如繼往的,session 並沒有使用 php 自帶的 session 機制,而是系統的一套自帶的機制。在資料庫中可以看到有兩個 session 表 乙個是pre common adminsession,是管理員登入後台的 session 表 另乙個是 pre common se...