平時一說進程間通信,你們都會想到AIDL,其實messenger和AIDL做用同樣,均可以進行進程間通信。它是基於消息的進程間通訊,就像子線程和UI線程發送消息那樣,是否是很簡單,還不用去寫AIDL文件,是否是有點小爽。哈哈。android
此外,還支持記錄客戶端對象的Messenger,而後能夠實現一對多的通訊;甚至做爲一個轉接處,任意兩個進程都能經過服務端進行通訊。多線程
與 AIDL 比較:工具
當您須要執行 IPC 時,爲您的接口使用 Messenger 要比使用 AIDL 實現更加簡單,由於 Messenger 會將全部服務調用排入隊列,而純粹的 AIDL 接口會同時向服務發送多個請求,服務隨後必須應對多線程處理。測試
對於大多數應用,服務不須要執行多線程處理,所以使用 Messenger 可以讓服務一次處理一個調用。若是您的服務必須執行多線程處理,則應使用 AIDL 來定義接口。spa
接下來看下怎麼寫:線程
服務端:對象
1.建立一個handler對象,並實現hanlemessage方法,用於接收來自客戶端的消息,並做處理接口
2.建立一個messenger(送信人),封裝handler隊列
3.messenger建立一個IBinder對象,經過onBind返回給客戶端進程
客戶端:
1.在activity中綁定服務
2.建立ServiceConnection並在其中使用 IBinder 將 Messenger實例化
3.使用Messenger向服務端發送消息
4.解綁服務
5.服務端中在 handleMessage() 方法中接收每一個 Message
這樣,客戶端並無調用服務的「方法」。而客戶端傳遞的「消息」(Message 對象)是服務在其 Handler 中接收的。
上面實現的僅僅是單向通訊,即客戶端給服務端發送消息,若是我須要服務端給客戶端發送消息又該怎樣作呢?
其實,這也是很容易實現的,下面就讓咱們接着上面的步驟來實現雙向通訊吧
1.在客戶端中建立一個Handler對象,用於處理服務端發過來的消息
2.建立一個客戶端本身的messenger對象,並封裝handler。
3.將客戶端的Messenger對象賦給待發送的Message對象的replyTo字段
4.在服務端的Handler處理Message時將客戶端的Messenger解析出來,並使用客戶端的Messenger對象給客戶端發送消息
這樣就實現了客戶端和服務端的雙向通訊了。
注意:注:Service在聲明時必須對外開放,即android:exported="true";另外,我在開發完APP都會用一些APP在線自動化測試工具進行測試:www.ineice.com