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将消息跨进程)发送给了mTargetmTarget又将消息发送给了Handler,这样就实现了跨进程通信。

 

0 0