IBinder是遠(yuǎn)程對(duì)象的基本接口,是為高性能而設(shè)計(jì)的輕量級(jí)遠(yuǎn)程調(diào)用機(jī)制的核心部分。但它不僅用于遠(yuǎn)程調(diào)用,也用于進(jìn)程內(nèi)調(diào)用。這個(gè)接口定義了與遠(yuǎn)程對(duì)象交互的協(xié)議。不要直接實(shí)現(xiàn)這個(gè)接口,而應(yīng)該從Binder派生。
成都創(chuàng)新互聯(lián)是專業(yè)的君山網(wǎng)站建設(shè)公司,君山接單;提供做網(wǎng)站、成都做網(wǎng)站,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行君山網(wǎng)站開發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
IBinder的 主要API是transact(),與它對(duì)應(yīng)另一方法是Binder.onTransact()。第一個(gè)方法使你可以向遠(yuǎn)端的IBinder對(duì)象發(fā)送發(fā)出 調(diào)用,第二個(gè)方法使你自己的遠(yuǎn)程對(duì)象能夠響應(yīng)接收到的調(diào)用。IBinder的API都是同步執(zhí)行的,比如transact()直到對(duì)方的 Binder.onTransact()方法調(diào)用完成后才返回。調(diào)用發(fā)生在進(jìn)程內(nèi)時(shí)無(wú)疑是這樣的,而在進(jìn)程間時(shí),在IPC的幫助下,也是同樣的效果。
通過transact()發(fā)送的數(shù)據(jù)是Parcel,Parcel是一種一般的緩沖區(qū),除了有數(shù)據(jù)外還帶有一些描述它內(nèi)容的元數(shù)據(jù)。元數(shù)據(jù)用于管理 IBinder對(duì)象的引用,這樣就能在緩沖區(qū)從一個(gè)進(jìn)程移動(dòng)到另一個(gè)進(jìn)程時(shí)保存這些引用。這樣就保證了當(dāng)一個(gè)IBinder被寫入到Parcel并發(fā)送到 另一個(gè)進(jìn)程中,如果另一個(gè)進(jìn)程把同一個(gè)IBinder的引用回發(fā)到原來(lái)的進(jìn)程,那么這個(gè)原來(lái)的進(jìn)程就能接收到發(fā)出的那個(gè)IBinder的引用。這種機(jī)制使 IBinder和Binder像唯一標(biāo)志符那樣在進(jìn)程間管理。
系統(tǒng)為每個(gè)進(jìn)程維護(hù)一個(gè)存放交互線程的線程池。這些交互線程用于派送所有 從另外進(jìn)程發(fā)來(lái)的IPC調(diào)用。例如:當(dāng)一個(gè)IPC從進(jìn)程A發(fā)到進(jìn)程B,A中那個(gè)發(fā)出調(diào)用的線程(這個(gè)應(yīng)該不在線程池中)就阻塞在transact()中 了。進(jìn)程B中的交互線程池中的一個(gè)線程接收了這個(gè)調(diào)用,它調(diào)用Binder.onTransact(),完成后用一個(gè)Parcel來(lái)做為結(jié)果返回。然后進(jìn) 程A中的那個(gè)等待的線程在收到返回的Parcel后得以繼續(xù)執(zhí)行。實(shí)際上,另一個(gè)進(jìn)程看起來(lái)就像是當(dāng)前進(jìn)程的一個(gè)線程,但不是當(dāng)前進(jìn)程創(chuàng)建的。
Binder機(jī)制還支持進(jìn)程間的遞歸調(diào)用。例如,進(jìn)程A執(zhí)行自己的IBinder的transact()調(diào)用進(jìn)程B的Binder,而進(jìn)程B在其 Binder.onTransact()中又用transact()向進(jìn)程A發(fā)起調(diào)用,那么進(jìn)程A在等待它發(fā)出的調(diào)用返回的同時(shí),還會(huì)用 Binder.onTransact()響應(yīng)進(jìn)程B的transact()??傊瓸inder造成的結(jié)果就是讓我們感覺到跨進(jìn)程的調(diào)用與進(jìn)程內(nèi)的調(diào)用沒什 么區(qū)別。
當(dāng)操作遠(yuǎn)程對(duì)象時(shí),你經(jīng)常需要查看它們是否有效,有三種方法可以使用:
1 transact()方法將在IBinder所在的進(jìn)程不存在時(shí)拋出RemoteException異常。
2 如果目標(biāo)進(jìn)程不存在,那么調(diào)用pingBinder()時(shí)返回false。
3 可以用linkToDeath()方法向IBinder注冊(cè)一個(gè)IBinder.DeathRecipient,在IBinder代表的進(jìn)程退出時(shí)被調(diào)用。
更多ibinder相關(guān)閱讀請(qǐng)點(diǎn)擊內(nèi)推資訊→www.neitui.me/zx/
內(nèi)行問答-互聯(lián)網(wǎng)行業(yè)經(jīng)驗(yàn)交流平臺(tái)→www.neitui.me/dkc/
內(nèi)推網(wǎng)(www.neitui.me ),專注于做互聯(lián)網(wǎng)招聘行業(yè)內(nèi)部推薦、打造最專業(yè)的互聯(lián)網(wǎng)招聘內(nèi)部推薦直招平臺(tái)。