您的位置:首页 > 移动开发 > Android开发

Android中的信使Messenger的源码解析

2015-06-02 23:52 357 查看
通过Messenger可以实现基于message的IPC通信。

Messenger内部引用了一个Handler,通过Messenger的getBinder方法返回一个IBinder对象,客户端通过bindServer方法绑定到Service时候得到IBinder对象,通过

Messenger messenger = IMesssenger.Stub.asInterface(IBinder)


通过IBinder得到服务端的代理Messenger对象,通过该对象可以实现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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息