查看Handler源码的时候会看到有个IMessenger类型的变量mMessenger,从名字来看是一个接口,然后顺着找下去可以看到一个getIMessenger()方法如下:
可以找到它的实现类是MessengerImpl,这个类Handler的内部类继承了IMessenger.Stub,这个貌似跟IPC有关系,应该有一个IMessenger.aidl文件。查看android.os包,果然找到了这个文件,有一个send方法,参数是Message。
final IMessenger getIMessenger() {
synchronized (mQueue) {
if (mMessenger != null) { return mMessenger; }
mMessenger = new MessengerImpl(); return mMessenger;
}
}
private final class MessengerImpl extends IMessenger.Stub {
public void send(Message msg) {
msg.sendingUid = Binder.getCallingUid();
Handler.this.sendMessage(msg);
}
}
可以找到它的实现类是MessengerImpl,这个类Handler的内部类继承了IMessenger.Stub,这个貌似跟IPC有关系,应该有一个IMessenger.aidl文件。查看android.os包,果然找到了这个文件,有一个send方法,参数是Message。
/** @hide */
oneway interface IMessenger {
void send(in Message msg);
}
可以推断Handler支持跨进程通信,这时候就我们的另一个主角Messenger就出现了,Messenger实现Parcelable,上主要代码:
public final class Messenger implements Parcelable {
private final IMessenger mTarget;
public Messenger(IBinder target) {
mTarget = IMessenger.Stub.asInterface(target);
}
public Messenger(Handler target) {
mTarget = target.getIMessenger();
}
public void send(Message message) throws RemoteException {
mTarget.send(message);
}
public IBinder getBinder() {
return mTarget.asBinder();
}
}
mTarget就是那个Handler中看到的IMessenger。那么如何使用呢?首先创建服务端工程