当前位置:   article > 正文

Android Messenger 原理分析_android imessenger

android imessenger
一、个人理解
 
使用场景:用于进程间通信,当进程间通信只需要收发消息,没有其他复杂的逻辑的时候。
 
实现原理:AIDL + Handler。内部定义并实现了只有一个接口的AIDL文件(IMessenger.aidl);Handler存在是为了实现反向通信,代替AIDL中定义的回调接口。
 
特点:与AIDL相比,用户无需自己定义AIDL接口,实现进程间双向通信时也无需定义AIDL回调。但Messenger通信接口只有一个。
 
二、原理分析
 
Messenger 有两个构造函数:
 
  1. 33    private final IMessenger mTarget;
  2. 43    public Messenger(Handler target) {
  3. 44        mTarget = target.getIMessenger();
  4. 45    }
  5. 145    public Messenger(IBinder target) {
  6. 146        mTarget = IMessenger.Stub.asInterface(target);
  7. 147    }

在进程间通信中,一般在Service(准确的说是服务端)使用第一个构造函数:

  1.  @Override
  2. public IBinder onBind(Intent intent) {
  3.      return new Messenger(mHandler).getBinder();  // getBinder() 返回的是 mTarget.asBinder()
  4.  }
  5.  private Handler mHandler = new Handler() {  // 创建的是主线程的Handler,所以此处是在主线程处理客户端发过来的消息的
  6.      @Override
  7.      public void handleMessage(Message msg) {
  8.           //处理客户端传来的消息
  9.      }
  10.  };

我们看一下为什么。

第一个 构造函数中的  target.getIMessenger() 返回的是一个Binder:
 
  1. Handler.java:
  2. 850    @UnsupportedAppUsage
  3. 851    final IMessenger getIMessenger() {
  4. 852        synchronized (mQueue) {
  5. 853            if (mMessenger != null) {
  6. 854                return mMessenger;
  7. 855            }
  8. 856            mMessenger = new MessengerImpl();
  9. 857            return mMessenger;
  10. 858        }
  11. 859    }
  12. 860
  13. 861    private final class MessengerImpl extends IMessenger.Stub {
  14. 862        public void send(Message msg) {
  15. 863    
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/122600
推荐阅读
相关标签
  

闽ICP备14008679号