Messenger跨進程通信架構

Framework Messenger Mechanism

Messenger基於aidl,最重要的一個aidl接口是IMessenger.aidl
@framework/base/core/java/android/os/IMessenger.aidl

package android.os;

import android.os.Message;

/** @hide */
oneway interface IMessenger {
    void send(in Message msg);
}

IMessenger相關的所有文件如下:

@framework/base/core/java/android/os/IMessenger.aidl
@framework/base/core/java/android/os/Message.aidl
@framework/base/core/java/android/os/Message.java
@framework/base/core/java/android/os/Messenger.aidl
@framework/base/core/java/android/os/Messenger.java
@framework/base/core/java/android/os/Handler.java

通信流程

服務端實現

  1. 創建Messenger對象,同時創建並獲取Handler裏的IMessenger.Stub對象
public final class Messenger implements Parcelable {
    private final IMessenger mTarget;
    public Messenger(Handler target) {
        mTarget = target.getIMessenger();
    }
    public IBinder getBinder() {
        return mTarget.asBinder();
    }
}
  1. IMessenger.Stub內部關聯Handler,接收到的Message轉發到handleMessage(Message msg)
public class Handler {
    final IMessenger getIMessenger() {
        synchronized (mQueue) {
            if (mMessenger != null) {
                return mMessenger;
            }
            mMessenger = new MessengerImpl();
            return mMessenger;
        }
    }

    private final class MessengerImpl extends IMessenger.Stub {
        public void send(Message msg) {
            msg.sendingUid = Binder.getCallingUid();
            Handler.this.sendMessage(msg);
        }
    }
}
  1. 客戶端綁定服務的時候通過Messenger#getBinder()返回IBinder對象
    @Override
    public IBinder onBind(Intent intent) {
        if (mMessenger == null) {
            return null;
        }
        return mMessenger.getBinder();
    }
  1. 客戶端接收到onBind返回後,以IBinder爲參數創建Messenger對象
        public void onServiceConnected(ComponentName name, IBinder service) {
            mService = new Messenger(service);
        }

以上就完成了客戶端向服務端發送數據的過程

客戶端實現

  1. 與服務端一樣創建Messenger對象並持有IMessenger對象
public final class Messenger implements Parcelable {
    private final IMessenger mTarget;
    public Messenger(Handler target) {
        mTarget = target.getIMessenger();
    }
}
  1. 客戶端發送Message的時候傳入Messenger對象
public final class Message implements Parcelable {
    public Messenger replyTo;
}
  1. 服務端獲取Message裏的Messenger對象併發送數據到客戶端
public final class Messenger implements Parcelable {
    private final IMessenger mTarget;
    public void send(Message message) throws RemoteException {
        mTarget.send(message);
    }
}

以上就完成了服務端向客戶端發送數據的過程

Messenger特性

  1. 雙向通信
  2. 異步
  3. 數據處理使用Handler機制
  4. 支持多客戶端
  5. 多線程
  6. 封裝了aidl細節
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章