平時一說進程間通訊,大家都會想到AIDL壹店,其實messenger和AIDL作用一樣绑警,都可以進行進程間通訊求泰。它是基于消息的進程間通信,就像子線程和UI線程發(fā)送消息那樣计盒,是不是很簡單渴频,還不用去寫AIDL文件,是不是有點小爽北启。哈哈卜朗。
此外,還支持記錄客戶端對象的Messenger咕村,然后可以實現(xiàn)一對多的通信场钉;甚至作為一個轉(zhuǎn)接處,任意兩個進程都能通過服務(wù)端進行通信懈涛。
與AIDL比較:
當(dāng)您需要執(zhí)行IPC時逛万,為您的接口使用Messenger要比使用AIDL實現(xiàn)更加簡單,因為Messenger會將所有服務(wù)調(diào)用排入隊列肩钠,而純粹的AIDL接口會同時向服務(wù)發(fā)送多個請求泣港,服務(wù)隨后必須應(yīng)對多線程處理暂殖。
對于大多數(shù)應(yīng)用,服務(wù)不需要執(zhí)行多線程處理当纱,因此使用Messenger可讓服務(wù)一次處理一個調(diào)用呛每。如果您的服務(wù)必須執(zhí)行多線程處理,則應(yīng)使用AIDL來定義接口坡氯。
接下來看下怎么寫:
服務(wù)端:
1.創(chuàng)建一個handler對象晨横,并實現(xiàn)hanlemessage方法,用于接收來自客戶端的消息箫柳,并作處理
2.創(chuàng)建一個messenger(送信人),封裝handler
3.messenger創(chuàng)建一個IBinder對象手形,通過onBind返回給客戶端
客戶端:
1.在activity中綁定服務(wù)
2.創(chuàng)建ServiceConnection并在其中使用IBinder將Messenger實例化
3.使用Messenger向服務(wù)端發(fā)送消息
4.解綁服務(wù)
5.服務(wù)端中在handleMessage()方法中接收每個Message
這樣,客戶端并沒有調(diào)用服務(wù)的“方法”悯恍。而客戶端傳遞的“消息”(Message對象)是服務(wù)在其Handler中接收的库糠。
上面實現(xiàn)的僅僅是單向通信,即客戶端給服務(wù)端發(fā)送消息涮毫,如果我需要服務(wù)端給客戶端發(fā)送消息又該怎樣做呢瞬欧?
其實,這也是很容易實現(xiàn)的罢防,下面就讓我們接著上面的步驟來實現(xiàn)雙向通信吧
1.在客戶端中創(chuàng)建一個Handler對象艘虎,用于處理服務(wù)端發(fā)過來的消息
2.創(chuàng)建一個客戶端自己的messenger對象,并封裝handler咒吐。
3.將客戶端的Messenger對象賦給待發(fā)送的Message對象的replyTo字段
4.在服務(wù)端的Handler處理Message時將客戶端的Messenger解析出來野建,并使用客戶端的Messenger對象給客戶端發(fā)送消息
這樣就實現(xiàn)了客戶端和服務(wù)端的雙向通信了。
注意:注:Service在聲明時必須對外開放恬叹,即android:exported="true"候生;另外,我在開發(fā)完APP都會用一些APP在線自動化測試工具進行測試:www.ineice.com