Android Messenger 原理分析

本文详细分析了Android Messenger的实现原理,涉及IPC通信中的AIDL接口,阐述了如何通过Service的onBind()方法返回的MessengerImpl实例进行进程间消息传递。Messenger与IMessenger的结合使用,以及Message对象在其中的角色,尤其是如何通过replyTo字段实现代理回调,确保了客户端和服务端的双向通信。
摘要由CSDN通过智能技术生成
一、个人理解
 
使用场景:用于进程间通信,当进程间通信只需要收发消息,没有其他复杂的逻辑的时候。
 
实现原理: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    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值