在android IPC中有介紹到一個(gè)可以跨進(jìn)程的通信方法Messenger,翻譯為信使苇倡,這很貼切它就是扮演這個(gè)角色用的舀瓢,可以在不同的進(jìn)程間傳遞信息滞乙,也就是Message對(duì)象债蓝。在Message對(duì)象中可以放入我們需要傳遞的數(shù)據(jù)壳鹤,Messenger是一種輕量級(jí)的IPC方案,它的底層實(shí)現(xiàn)的是AIDL饰迹,我們可以通過(guò)該類的構(gòu)造方法就明白了芳誓,不清楚AIDL的同學(xué)可以自行去翻看這類的資料。Messenger通常用在服務(wù)端進(jìn)程和客戶端進(jìn)程通信中啊鸭,這里服務(wù)端是android中常見(jiàn)的Service而客戶端可以理解為Activity锹淌。
Messenger的使用很簡(jiǎn)單,由于它一次處理一個(gè)請(qǐng)求赠制,因此在服務(wù)端我們不需要考慮線程同步問(wèn)題赂摆,這也是因?yàn)榉?wù)端不存在并發(fā)執(zhí)行的情形。使用Messenger有如下幾個(gè)步驟分為服務(wù)端和客戶端:
- 服務(wù)端
先看服務(wù)端:
上圖中是一個(gè)普通的Service钟些,在其中我們使用Messenger來(lái)接受并恢復(fù)客戶端發(fā)來(lái)的信息烟号。客戶端需要使用
bindService
方法 來(lái)綁定服務(wù)政恍。因此在service的onBind方法中需要返回一個(gè)IBinder對(duì)象汪拥,此對(duì)象從Messenger中獲取。在此我們可以看出Messenger就相當(dāng)于做橋梁一樣負(fù)責(zé)傳輸信息篙耗。
- 客戶端
客戶端很簡(jiǎn)單喷楣,就和普通使用bindService一樣,在onServiceConnection的時(shí)候向服務(wù)器發(fā)送一條信息鹤树,并且由于這里設(shè)置了服務(wù)端會(huì)恢復(fù)給客戶端因此铣焊,在message.replyTo=replay;
方法 將傳過(guò)去的信息告訴服務(wù)端用什么來(lái)回復(fù)我。replay對(duì)象 是存在于客戶端的Messenger對(duì)象罕伯,在該對(duì)象的Handler中我們就可以獲取服務(wù)端傳回來(lái)的信息曲伊。
到這里可能會(huì)說(shuō),并沒(méi)有實(shí)現(xiàn)跨進(jìn)程啊追他,我想說(shuō)的是這里我們的Service使用的是在清單文件中指定的process屬性坟募。當(dāng)啟動(dòng)它的時(shí)候 我們可以看到后臺(tái)有兩個(gè)進(jìn)程的存在。當(dāng)然啦 它也能用在同進(jìn)程的應(yīng)用中邑狸。