首先先分析服務(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è)過程是不需要我們來寫得缝呕。