Android源碼學(xué)習(xí)筆記1-Messenger源碼的學(xué)習(xí)

首先先分析服務(wù)端:

服務(wù)端必有:

public IBinder onBind(Intent intent) { return messenger.getBinder();}
則得到getBinder()這個(gè)方法:
public IBinder getBinder() { return mTarget.asBinder();}
由此得到mTarget 這個(gè)變量月培,分析這個(gè)target類:
private final IMessenger mTarget;
得到IMessenger這個(gè)類:
IMessenger這是一個(gè)基于AIDL寫法的接口類门岔,繼承自IInterface穆律,其結(jié)構(gòu)和系統(tǒng)自動(dòng)生成aidl的方法大體相同豌拙,一個(gè)stub類和一個(gè)端口proxy類,可以說是對(duì)系統(tǒng)aidl生成做了一定的封裝,所以不用我們自己寫aidl文件。
既然這是一個(gè)接口蝶柿,那就需要實(shí)現(xiàn),看一下mTarget從哪里來:
public Messenger(Handler target) {mTarget = target.getIMessenger();}
發(fā)現(xiàn)這個(gè)是從handler過來的:
final IMessenger getIMessenger() { synchronized (mQueue) { if (mMessenger != null) { return mMessenger; } mMessenger = new MessengerImpl(); return mMessenger; }
發(fā)現(xiàn)這是一個(gè)handler內(nèi)部變量IMessenger mMessenger非驮,則基本上我們不會(huì)自己去實(shí)現(xiàn)這個(gè)IMessenger類交汤,所以會(huì)執(zhí)行到MessengerImpl:
private final class MessengerImpl extends IMessenger.Stub { public void send(Message msg) { msg.sendingUid = Binder.getCallingUid(); Handler.this.sendMessage(msg); }}
會(huì)發(fā)現(xiàn),則個(gè)內(nèi)部類實(shí)現(xiàn)了send方法劫笙,就是將message通過自身handler機(jī)制芙扎,發(fā)送到記得消息隊(duì)列中,讓自己來處理填大,所以我們肯定可以在handler內(nèi)部的handlemessage方法中處理遠(yuǎn)程服務(wù)發(fā)過來的消息戒洼,所以當(dāng)我們?yōu)槲覀兊?strong>message給replyto賦值messenger時(shí),我們就能夠?qū)⑾?nèi)容發(fā)送到定義的handler消息隊(duì)列處理允华,然后這個(gè)replyto 這個(gè)messenger對(duì)象可以通過binder機(jī)制圈浇,因?yàn)橐呀?jīng)實(shí)現(xiàn)了IMessenger接口,則如果是本地的話例获,可以返回stub對(duì)象汉额,如果是遠(yuǎn)程服務(wù)曹仗,則可返回proxy對(duì)象實(shí)現(xiàn)跨進(jìn)程通信榨汤。

客戶端:

客戶端連接的話,必定實(shí)現(xiàn)

public Messenger(IBinder target) { mTarget = IMessenger.Stub.asInterface(target);}

由此可見怎茫,這就是基于aidl的通信收壕,知道aidl的,aidl會(huì)自定生成一個(gè)類轨蛤,其asInterface里會(huì)判斷是本地服務(wù)還是遠(yuǎn)程服務(wù)蜜宪,然后選擇本地發(fā)送還是通過Proxy發(fā)送,調(diào)用send方法 祥山,我們可以看到圃验,數(shù)據(jù)的序列化和反序列化都在message中做好了,所以整個(gè)過程是不需要我們來寫得缝呕。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末澳窑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子供常,更是在濱河造成了極大的恐慌摊聋,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件栈暇,死亡現(xiàn)場(chǎng)離奇詭異麻裁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門煎源,熙熙樓的掌柜王于貴愁眉苦臉地迎上來色迂,“玉大人,你說我怎么就攤上這事薪夕〗挪荩” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵原献,是天一觀的道長(zhǎng)馏慨。 經(jīng)常有香客問我,道長(zhǎng)姑隅,這世上最難降的妖魔是什么写隶? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮讲仰,結(jié)果婚禮上慕趴,老公的妹妹穿的比我還像新娘。我一直安慰自己鄙陡,他們只是感情好冕房,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著趁矾,像睡著了一般耙册。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上毫捣,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天详拙,我揣著相機(jī)與錄音,去河邊找鬼蔓同。 笑死饶辙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的斑粱。 我是一名探鬼主播弃揽,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼则北!你這毒婦竟也來了矿微?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤咒锻,失蹤者是張志新(化名)和其女友劉穎冷冗,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惑艇,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蒿辙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年拇泛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片思灌。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡俺叭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出泰偿,到底是詐尸還是另有隱情熄守,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布耗跛,位于F島的核電站裕照,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏调塌。R本人自食惡果不足惜晋南,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望羔砾。 院中可真熱鬧负间,春花似錦、人聲如沸姜凄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽态秧。三九已至董虱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間屿聋,已是汗流浹背空扎。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工藏鹊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留润讥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓盘寡,卻偏偏與公主長(zhǎng)得像楚殿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子竿痰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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