Android中的信使Messenger的源码解析
2015-06-20 00:00
471 查看
通过Messenger可以实现基于message的IPC通信。
Messenger内部引用了一个Handler,通过Messenger的getBinder方法返回一个IBinder对象,这个IBinder可以实现IPC通信。
mTarget是IMessenger类型。在Messenger的构造方法中对mTarget进行了初始化。
通过调用Handler的getIMessenger方法得到mTarget。
mMessenger是Handler内部类MessengerImpl的一个实例。
Binder.getCallingUid()方法返回发送当前正在处理的这个事务的进程uid。
通过handler的sendMessage将该消息发送到当前线程的消息队列中。
总结:Messenger实现了Parcelable接口,我们可以在服务端将Messenger作为IBinder返回给客户端,客户端将IBinder转成IMessenger类型,通过调用IMessenger的send()方法向服务端发送Message。
android.os.MessengerService实现了基于Messenger通信的Service。
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。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories