Messenger,Handler,IBinder是如何合作实现跨进程通信的
来源:互联网 发布:itouch4怎么下载软件 编辑:程序博客网 时间:2024/05/21 22:42
Messenger是什么?
Messenger可直译为送信者,是Android提供的轻量级IPC(进程间通信)方案,通过它,我们可以在不同进程之间传递Message对象。
我们知道在Android中,IPC的实现大都是依赖IBinder(AIDL)机制(简单来说就是提供远程过程调用(RPC)功能,想要了解可以看http://blog.csdn.net/luoshengyang/article/details/6618363)。Messenger也是封装了IBinder机制来实现进程间通信。
Messenger是如何工作的?
先来看看如何创建一个Messenger,构造函数有两个:
private final IMessenger mTarget;public Messenger(Handler target) { mTarget = target.getIMessenger(); }public Messenger(IBinder target) { mTarget = IMessenger.Stub.asInterface(target);}
一目了然,这两个构造函数分别根据Handler和IBinder获得抽象类IMessenger的mTarget对象。
看看Messenger的getBinder方法:
public IBinder getBinder() { return mTarget.asBinder();}
第二个构造函数传入的IBinder是来自第一个构造函数的mTarget。
因此第一个构造函数构造了接收者,第二个构造函数构造了发送者,发送者可以发送消息给接收者。
那么mTarget这个对象到底是谁呢?
根据AIDL的相关知识可知,若是在同一进程中,这两个mTarget是同一个IMessenger.Stub的具体实现对象MessengerImpl(Hadndler的内部类)。
若是在不同进程中,它们分别位于两端进程。第一个mTarget同上,,第二个是代理者IMessenger.Stub.Proxy,负责将信息跨进程发送给前者。
Message是如何传递的?
看Messenger的send方法:
public void send(Message message) throws RemoteException { mTarget.send(message);}
再看IMessenger中的具体实现
private final class MessengerImpl extends IMessenger.Stub { public void send(Message msg) { msg.sendingUid = Binder.getCallingUid(); Handler.this.sendMessage(msg); }}
果然,Messager将消息(跨进程)发送给了mTarget,mTarget又将消息发送给了Handler,这样就实现了跨进程通信。
- Messenger,Handler,IBinder是如何合作实现跨进程通信的
- Messenger实现跨进程通信
- Handler的跨进程使用--Messenger学习
- Messenger 跨进程通信
- Messenger:使用消息的跨进程通信
- Messenger:使用消息的跨进程通信
- Messenger:使用消息的跨进程通信
- Messenger:使用消息的跨进程通信
- Messenger:使用消息的跨进程通信
- Messenger:使用消息的跨进程通信
- Android Messenger简单的跨进程通信
- android Messenger 跨进程通信
- android Messenger 跨进程通信
- Android Messenger 跨进程通信!!!!!!!!!!!!!!!!!!
- Android Messenger 跨进程通信
- 【Android】Messenger 跨进程通信
- Android Messenger 跨进程通信
- Android Messenger 跨进程通信
- USB协议及认知
- SIM800系列模块GSM/GPRS建立TCP连接到远端服务器过程
- 【解题报告】Vijos1143 三取方格数
- 【九度OJ】题目1473:二进制数 解题报告
- 忘记apusic应用服务器web控制台admin密码怎么办?
- Messenger,Handler,IBinder是如何合作实现跨进程通信的
- 使用CSDN Markdown编辑器写博客
- HDU4722~Good Numbers(思路)
- Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)
- Oracle 12.2 sec_case_sensitive_logon设置为true 或者false 时,针对 system用户和新建用户的区别.
- 关于数组元素的排列组合
- 最短路径相关求解方法
- hal层代码
- IPv6和高级网络协议