前言
在本系列第一篇写了服务的两种启动方式,其中之一是bindservice。对于bindservice需要提供一个IBinder在onBind()方法返回。有三种方法可以提供这个Ibinder.分别是
- 直接定义一个Binder子类,在onBind()中返回
- 使用Messenger
- 使用AIDL
第一种在第一篇中已经讲过,今天探究下Messenger的特点和简单使用
正文
普通bindService和Messenger的区别
- 普通bindservice只能在同一个进程里使用
- Messenger可以在不同进程里使用,既可以进行进程间通讯
Messenger的使用
先说下Messenger使用方法概括,然后结合代码示例验证:
- 在Service中实现一个Handler,该Handler为客户端的每一次调用接受一个回调即handleMessage()方法
- 该Handler用来创建一个Messenger对象,该Messenger对象是该Handler的一个引用
- 上面创建的Messenger创建一个IBinder,并通过onBind()把该IBinder返回给客户端
- 客户端用上面返回的IBinder去实例化一个Messenger对象,客户端用该Messenger给服务发送Message对象。
- 在服务中心定义的Handler接收到客户端发送的Message对象来处理消息。 综上:使用Messenger,服务里没有像普通BinderService那样提供给客户端可调用的方法,而是客户端通过发送消息(Message)给服务的Handler进行通讯。
代码示例:
先按照上面所说的,写服务端代码完成代码,在代码中逐条注释了上面总结的几点
public class MessengerService extends Service {
private MyHandler myHandler = new MyHandler();
//在Service中实现一个Handler,该Handler为客户端的每一次调用接受一个回调即handleMessage()方法
public class MyHandler extends Handler{
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case 1:
Toast.makeText(getApplicationContext(),"我来自客户端",Toast.LENGTH_SHORT).show();
break;
default:
super.handleMessage(msg);
}
}
}
//该Handler用来创建一个Messenger对象,该Messenger对象是该Handler的一个引用
Messenger messenger = new Messenger(myHandler);
public MessengerService() {
}
@Override
public IBinder onBind(Intent intent) {
// 上面创建的Messenger创建一个IBinder,并通过onBind()把该IBinder返回给客户端
return messenger.getBinder();
}
}
然后客户端代码如下,在客户端bind成功后,立马给服务端发一个消息,服务端接收到消息后,弹出一个Toast:
public void bind(View v) {
bindLocalService();
}
private void bindLocalService() {
Intent intent = new Intent(this, MessengerService.class);
bindService(intent, mSerConection, Context.BIND_AUTO_CREATE);
}
private ServiceConnection mSerConection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//客户端用上面返回的IBinder去实例化一个Messenger对象
Messenger msger = new Messenger(service);
//客户端用该Messenger给服务发送Message对象。
Message msg = Message.obtain();
msg.what = 1;
try {
msger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.i(TAG, "取消bind");
}
};
至此,对Messenger的探讨暂时到此,后面会研究下,Messgener客户端和服务端的双端通讯