一.远程服务器端
Messenger mMessenger = new Messenger(newHandler());
@Override
public IBinder onBind(Intent intent) {
return mMessenger.getBinder();
}
服务端通过mMessenger.getBinder()返回给客户端一个binder对象;下面我们来分析一下源码:
Messenger对象
private final IMessenger mTarget;
public Messenger(Handler target) {
mTarget = target.getIMessenger();
}
public IBinder getBinder() {
return mTarget.asBinder();
}
Handler对象
final IMessenger getIMessenger() {
synchronized (mQueue) {
if (mMessenger != null) {
return mMessenger;
}
mMessenger = new MessengerImpl();
return mMessenger;
}
}
MessengerImpl对象
private final class MessengerImpl extends IMessenger.Stub {
public void send(Message msg) {
Handler.this.sendMessage(msg);
}
}
当我们调用mMessenger.getBinder()这个方法时,底层会通过mTarget对象asBinder()方法返回binder对象,而
mTarget对象是我们在创建Messenger对象时通过传入其中的handler对象的getIMessenger()获取的,在Handler对象的getIMessenger()里,创建了一个MessengerImpl对象,它实现了 IMessenger.Stub由此可知Messenger也是通过aidl实现进程间通信的,mTarget=Messengerimpl,有上篇文章也就是aidl文件生成的gen目录下相相对应的java文件可知,我们可以通过mTarget.asBinder获得binder对象
二.客户端
final Messenger mMessenger = new Messenger(new Handler());//客户端的对象,服务端也可以通过此对象发送消息到客户端
private class MyServiceConnection implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i("Test", "onServiceConnected");
serice = new Messenger(service);
Message message = Message.obtain(null, 1);
message.replyTo = mMessenger;
try {
serice.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.i("Test", "onServiceDisconnected");
serice=null;
}
}
由于我们不能直接获得MessengerImpl对象,它是私有的,所以我们需要重新创建一个Messenger(Binder)对象,下面看源码
public Messenger(IBinder target) {
mTarget = IMessenger.Stub.asInterface(target);
}
public void send(Message message) throws RemoteException {
mTarget.send(message);
}
可知会调用MessengerImpl对象的send方法,有服务端源码可知MessengerImpl会调用 Handler.this.sendMessage(msg);把消息发送到我们在服务端创建Messenger对象时所传入的handler对象中