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 在處理消息就可以了。