Android中的信使Messenger的源码解析
16lz
2021-01-26
通过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。
更多相关文章
- android fragment于fragment之间通信
- (四十三)统计应用具体方法执行时长-Android(安卓)Profiler CPU
- android JNI_OnLoad()函数
- 《Android(安卓)JNI》04 对java传进来的数组进行操作并返回
- android AsynTask 实现原理
- Android(安卓)中使用onSaveInstanceState和onRestoreInstanceSta
- Android深入浅出系列课程---Lesson16-AFF110606_AsyncTask异步任
- android 修改launcher行数和列数的方法
- android退出应用