Binder學(xué)習(xí)筆記

直觀來說窟绷,Binder是Android中的一個類柳畔,它實現(xiàn)了IBinder接口嘿歌。從IPC角度來說掸掏,Binder是Android中的一個中跨進(jìn)程通信方式。

Android開發(fā)中宙帝,Binder主要用在Service中丧凤,包括AIDL和Messenger其中普通Service中的Binder不涉及進(jìn)程間通訊,而Messenger的底層其實是AID步脓,這里選擇用AIDL來分析Binder的工作機制愿待。為了分析Binder工作機制,接下來需要新建一個AIDL示例

首先創(chuàng)建一個Book類實現(xiàn)Parcelable


然后創(chuàng)建IBookManager.aidl是我們定義的一個接口靴患,里面有倆個方法:getBookList和addBook仍侥,然后通過Android Studio ?Build-->Make Project

就會在app-->build-->generated-->source-->aidl-->debig-->包名-->IBookManager接口繼承IInterface接口詳細(xì)介紹一下每個方法的含義

DESCRIPTOR

?BInder的唯一標(biāo)識,一般用當(dāng)前Binder的類名標(biāo)識鸳君。

asInterface(android.os.IBinder obj)

? ? 用于將服務(wù)端Binder對象轉(zhuǎn)換成客戶端所需要的AIDL接口類型對象农渊,這種轉(zhuǎn)換過程是區(qū)分進(jìn)程的,如果客戶端和服務(wù)端位于統(tǒng)一進(jìn)程或颊,那么此方法返回的就是服務(wù)端的Stub對象本身砸紊,否則返回的就是系統(tǒng)封裝后的Stub.proxy對象

asBinder

此方法用于返回當(dāng)前Binder對象

onTransact

這個方法運行服務(wù)器端中的Binder線程池中,當(dāng)客戶端發(fā)起跨進(jìn)程請求時囱挑,遠(yuǎn)程請求會通過系統(tǒng)底層封裝后交由此方法來處理醉顽。該方法的原型為public Boolean onTransact(int ?code,android.os.Parcel ?data平挑,android.os.Parcel reply游添,int flags)。服務(wù)端通過code可以確定客戶端請求的目標(biāo)方法是什么通熄,接著從data中取出目標(biāo)方法所需要的參數(shù)(如果目標(biāo)方法有參數(shù)的話)唆涝,然后執(zhí)行目標(biāo)方法。當(dāng)目標(biāo)方法執(zhí)行完畢后唇辨,就向reply中寫入返回值(如果目標(biāo)方法有返回值的話)石抡,onTransact方法執(zhí)行過程就是這樣的。需要注意的是助泽,如果此方法返回false,那么客戶端的請求會失敗嚎京,因此我們可以利用這個特性來做權(quán)限驗證,畢竟我們也不希望隨便一個進(jìn)程都能遠(yuǎn)程調(diào)用我們的服務(wù)鞍帝。

Proxy#getBookList

? ? 這個方法運行在客戶端诫睬,當(dāng)客戶端遠(yuǎn)程調(diào)用此方法時,它的內(nèi)部實現(xiàn)是這樣的:首先創(chuàng)建該方法所需要的輸入性Parcel對象 data帕涌、輸出型Parcel對象 reply和返回對象List摄凡;然后把該方法的參數(shù)信息寫入data中(如果有參數(shù)的話)续徽;接著調(diào)用transact方法來發(fā)起RPC(遠(yuǎn)程過程調(diào)用)請求,同時當(dāng)前線程掛起亲澡;然后服務(wù)端的onTransact方法會被調(diào)用钦扭,知道RPC過程返回后,當(dāng)前線程繼續(xù)執(zhí)行床绪,并從reply中取出RPC過程返回結(jié)果值客情;最后返回reply中的數(shù)據(jù)。

通過上面分析癞己,已經(jīng)知道Binder的工作機制膀斋,但是有兩點還是需要注意一下:首先,當(dāng)客戶端發(fā)起遠(yuǎn)程請求時痹雅,由于當(dāng)前線程會被掛機直至服務(wù)端返回數(shù)據(jù)仰担,所有如果一個遠(yuǎn)程方法是很耗時的,那么不能在UI線程中發(fā)起此遠(yuǎn)程請求绩社;其次由于服務(wù)端的Binder方法運行在Binder線程池中摔蓝,所以Binder方法不管是否耗時都應(yīng)該采用同步的方式實現(xiàn)(不是很理解這句話)

Binder有兩個很重要的方法linkToDeathunlinkToDeath我們知道铃将,Binder運行在服務(wù)端進(jìn)程项鬼,如果服務(wù)端進(jìn)程由于某種原因異常終止,這個時候我們到服務(wù)端的Binder連接斷裂(稱之為Binder死亡)劲阎,會導(dǎo)致我們遠(yuǎn)程調(diào)用失敗绘盟。更為關(guān)鍵的是,如果我們不知道Binder連接已經(jīng)斷裂悯仙,那么客戶端的功能就會受到影響龄毡。為了很好的解決這個問題,Binder中提供了倆個配對的方法linkToDeath和unlinkToDeath锡垄,通過linToDeath我們可以給Binder設(shè)置一個死亡代理沦零,當(dāng)Binder死亡是,我們就會收到通知货岭,這個時候我們就可以重新發(fā)起連接請求路操。


死亡監(jiān)聽


Binder設(shè)置死亡代理
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市千贯,隨后出現(xiàn)的幾起案子屯仗,更是在濱河造成了極大的恐慌,老刑警劉巖搔谴,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件魁袜,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機峰弹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門店量,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鞠呈,你說我怎么就攤上這事融师。” “怎么了粟按?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵诬滩,是天一觀的道長。 經(jīng)常有香客問我灭将,道長疼鸟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任庙曙,我火速辦了婚禮空镜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捌朴。我一直安慰自己吴攒,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布砂蔽。 她就那樣靜靜地躺著洼怔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪左驾。 梳的紋絲不亂的頭發(fā)上镣隶,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機與錄音诡右,去河邊找鬼安岂。 笑死,一個胖子當(dāng)著我的面吹牛帆吻,可吹牛的內(nèi)容都是我干的域那。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼猜煮,長吁一口氣:“原來是場噩夢啊……” “哼次员!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起王带,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤淑蔚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后辫秧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡被丧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年盟戏,在試婚紗的時候發(fā)現(xiàn)自己被綠了绪妹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡柿究,死狀恐怖邮旷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蝇摸,我是刑警寧澤婶肩,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站貌夕,受9級特大地震影響律歼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜啡专,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一险毁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧们童,春花似錦畔况、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至齐板,卻和暖如春吵瞻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背覆积。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工听皿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宽档。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓尉姨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親吗冤。 傳聞我的和親對象是個殘疾皇子又厉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容