一、个人理解
使用场景:用于进程间通信,当进程间通信只需要收发消息,没有其他复杂的逻辑的时候。
实现原理:AIDL + Handler。内部定义并实现了只有一个接口的AIDL文件(IMessenger.aidl);Handler存在是为了实现反向通信,代替AIDL中定义的回调接口。
特点:与AIDL相比,用户无需自己定义AIDL接口,实现进程间双向通信时也无需定义AIDL回调。但Messenger通信接口只有一个。
二、原理分析
Messenger 有两个构造函数:
33 private final IMessenger mTarget;
43 public Messenger(Handler target) {
44 mTarget = target.getIMessenger();
45 }
145 public Messenger(IBinder target) {
146 mTarget = IMessenger.Stub.asInterface(target);
147 }
在进程间通信中,一般在Service(准确的说是服务端)使用第一个构造函数:
@Override
public IBinder onBind(Intent intent) {
return new Messenger(mHandler).getBinder(); // getBinder() 返回的是 mTarget.asBinder()
}
private Handler mHandler = new Handler() { // 创建的是主线程的Handler,所以此处是在主线程处理客户端发过来的消息的
@Override
public void handleMessage(Message msg) {
//处理客户端传来的消息
}
};
我们看一下为什么。
第一个
构造函数中的
target.getIMessenger() 返回的是一个Binder:
Handler.java:
850 @UnsupportedAppUsage
851 final IMessenger getIMessenger() {
852 synchronized (mQueue) {
853 if (mMessenger != null) {
854 return mMessenger;
855 }
856 mMessenger = new MessengerImpl();
857 return mMessenger;
858 }
859 }
860
861 private final class MessengerImpl extends IMessenger.Stub {
862 public void send(Message msg) {
863