通过Messenger可以实现基于message的IPC通信。
Messenger内部引用了一个Handler,通过Messenger的getBinder方法返回一个IBinder对象,这个IBinder可以实现IPC通信。

public IBinder getBinder() {        return mTarget.asBinder();    }

mTarget是IMessenger类型。在Messenger的构造方法中对mTarget进行了初始化。

 public Messenger(Handler target) {        mTarget = target.getIMessenger();    }

通过调用Handler的getIMessenger方法得到mTarget。

final IMessenger getIMessenger() {        synchronized (mQueue) {            if (mMessenger != null) {                return mMessenger;            }            mMessenger = new MessengerImpl();            return mMessenger;        }    }

mMessenger是Handler内部类MessengerImpl的一个实例。

private final class MessengerImpl extends IMessenger.Stub {        public void send(Message msg) {            msg.sendingUid = Binder.getCallingUid();            Handler.this.sendMessage(msg);        }    }

Binder.getCallingUid()方法返回发送当前正在处理的这个事务的进程uid。
通过handler的sendMessage将该消息发送到当前线程的消息队列中。

总结:Messenger实现了Parcelable接口,我们可以在服务端将Messenger作为IBinder返回给客户端,客户端将IBinder转成IMessenger类型,通过调用IMessenger的send()方法向服务端发送Message。
android.os.MessengerService实现了基于Messenger通信的Service。

更多相关文章

  1. android fragment于fragment之间通信
  2. (四十三)统计应用具体方法执行时长-Android(安卓)Profiler CPU
  3. android JNI_OnLoad()函数
  4. 《Android(安卓)JNI》04 对java传进来的数组进行操作并返回
  5. android AsynTask 实现原理
  6. Android(安卓)中使用onSaveInstanceState和onRestoreInstanceSta
  7. Android深入浅出系列课程---Lesson16-AFF110606_AsyncTask异步任
  8. android 修改launcher行数和列数的方法
  9. android退出应用

随机推荐

  1. android 4.0 升级名单
  2. Android(安卓)Studio 下打包混淆apk报错:E
  3. Android指纹识别,2017/3/12 03
  4. android-----AsyncTask源码分析
  5. Android(安卓)壁纸 保存的目录
  6. LruCache源码解析
  7. Android超好用的图片加载框架
  8. TextUtils类介绍
  9. android Eclipse导入com.android.interna
  10. Android、java环境搭建流程