使用Messenger的IPC

以下是個人理解,錯的地方希望指正出來,謝謝。

想要跨進程的通訊,有兩種方法,一種是使用aidl,這個前面文章有提到。

還有一種是使用Messenger對象,這個對象實現了Parcelable接口。

在服務端的Service中我們要先實例化一個Messenger對象,傳入一個Handler,並且重寫handleMessage方法,用來處理客戶端發來的消息。

然後在onBind方法中返回mMessenger.getBinder();

之後是客戶端,客戶端想要與之通訊,必須持有服務端的IBinder。

bindService的ServiceConncetion中拿到Messenger對象,可以使用實例化Messenger,把IBinder做參數傳入。

實際上在實例化Messenger時,我們客戶端持有的是遠程的Binder,只是Android系統幫我們拿到了aidl接口。

拿到mMessenger時,就可以mMessenger.send(Message msg);實現通訊了。

那我們應該怎樣讓服務端來返回數據呢?

我們可以在send之前,讓msg.replyTo=Messenger;這是一個新得實例化的Messenger,用來接收服務端的數據,和obj的使用時一樣的。

在服務端就可以通過msg.replyTo拿到客戶端的Messenger,之後就可以通過Messenger.send();把數據返回給我們的客戶端,以達到雙向通訊的效果。

而前面說到,我們如果想要發送數據到服務端,使用msg.obj是會出異常的,所以我們必須使用實現parcelable接口的方法來傳遞數據,還沒有搞懂,稍後傳上去。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章