Messenger
Android 提供了一个比使用AIDL(Android Interface Definition Language)更简单的IPC(Interprocess communication)方法。
Messenger (信使)顾名思义,作用是传递消息,Messenger通过一个传入的构造Handler来接受消息,
用我们熟悉的handleMessage(Messager msg)
来处理消息,而Messenger的实例可以通过send()
函数来发送Message消息。通过这种机制简化了跨进程的实现,适合在大多数的场合,应为通常情况下,很少需要关心线程安全问题,而AIDL更适合在多个进程访问同一个service的时候使用。
如何使用
1.实现一个Handler 用于接收消息。
2.使用Handler来创建Messenger。
3.在service的onBind()
中返回Messenger的Ibinder,用于在客户端重新构造一个Messenger,而不是直接传递Messenger.
4.在客户端通过onServiceConnected()
返回的Ibinder对象,实例化Messenger,通过这个Messenger来发送Message对象。
5.客户端也可以新建一个Handler来构造一个用于服务器发送反馈的Messenger。这个Messenger可以赋值给message的replyto
属性,然后通过与服务器端相关的那个Messenger来发送到服务端。
简单的例子(关键代码)
Service端
class MessengerHandler extends Handler {
@Override
public void handlerMessage(Message msg) {
}
//在这里处理你的逻辑
}
//实例化Messnger
Messenger messnger = new Messenger(new MessengerHandler());
@Override
public IBinder onBind(Intent intent) {
return messnger.getBinder();//返回Messnger的Binder对象。
}
客户端
//实现serviceConnection 接口来绑定服务
private Messenger mMessenger;
class MyServiceConnection implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//构造出于服务端相关的Messenger
mMessenger = new Messenger(service);
Message msg = Message.obtain(null,0x01);
mMessenger.send(msg);//通过这个messenger来发送消息就可以实现IPC通信了。
}
}