Android進程間通信總結

AIDL方式:

1. 寫AIDL文件,其中有方法func1(), func2(), ..., funcN()

2. 編譯後產生AIDL生成Interface IMyAidl.java implements IInterface, 內部有靜態abstract Stub類extends Binder

3. 在服務端進程中,可以是Service,new一個IMyAidl.Stub()類, 實現func1(),  func2(), ..., funcN(), onBind()返回

4. 在客戶端進程中,可以是Activity,通過ServiceConnection中的onServiceConnected中獲取服務端的Service Binder, 通過IMyAidl.Stub.asInterface(iBinder)獲取IMyAidl實例,然後就可以通過此類調用func1(), func2(), ..., funcN()向服務端進程發送消息。

5. 服務端在實現func1(),  func2(), ..., funcN()z中處理消息


Messenger方式:

1. 在服務端進程中,可以是Service,new一個serverMessenger = Messenger(new Handler(){...handleMessage....}), onBind()中返回serverMessenger.getBinder()

2. 在客戶端進程中,可以是Activity,通過ServiceConnection中的onServiceConnected中獲取服務端的Service Binder, 通過Messenger(Binder)可以獲取服務端的serverMessenger, 通過serverMessenger.send(msg)向服務端發送消息,如果要求服務端回消息,則可以在msg.replyTo中設置clientMessenger(同樣在客戶端new 一個clientMessenger = Messenger(new Handler(){...handleMessage....}),).

3. 服務端在serverMessenger的handleMessage中處理到來的消息, 而且可以通過在msg中設置的replyTo找到clientMessenger, 使用clientMessenger.send(newMsg)進行迴應客戶端


爲什麼Messenger的send(msg)最後由其內部的handler.handleMessage()來處理呢?因爲Messenger的send(msg)實際上最後也是通過調用handler.send(msg)發出去的,當然最後還是回到其handleMessage來處理.


Messenger 其實就是 AIDL 的簡化版,它把接口都封裝好,我們只需在一個進程創建一個 Handler 傳遞給 Messenger,Messenger 幫我們把消息跨進程傳遞到另一個進程,我們在另一個進程的 Handler 在處理消息就可以了。

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