最近在看android开发艺术探索,感觉挺不错的,有很多之前自己没有接触的或者印象不太深刻的,以前一直都是转载别人,自己看看,就觉得会了。但现在总觉得,码农虽然贯穿懒字原则,但是适当的动手能力还是要有,个人不太习惯一有新需求就百度别人已经做好的在上面改改改,或者找别人封装好的直接用,这样感觉对自身技术提升太过狭隘了吧,所以打算做这样一些加深笔记,利人利己吧!
一.Messenger
Messenger意为信使,通过它可以在不同进程中传递Message对象,可以轻松实现进程间数据传递,它是一种轻量级的IPC方案,底层实现为AIDL,优点是我们可以方便的进行进程间通信,不用考虑线程同步问题,缺点就是它一次只能处理一个请求。Messenger是以串行方式处理发送端的消息,如果有大量消息同时到达,它还是只能一个个处理,而且Messenger主要用来传递消息,如果需要跨进程调用方法,就不能使用它,而是用AIDL。
二.代码示例
新建一个android项目,写个类继承Service。
public class MessengerService extends Service {
private final static int MSG_FROM_CLIENT = 1;
private Messenger messenger = new Messenger(new MessengerHandler());
private class MessengerHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_FROM_CLIENT:
Toast.makeText(MessengerService.this, "msg from client:" + msg.getData().getString("from"),
Toast.LENGTH_SHORT).show();
Messenger m = msg.replyTo;
Message message = Message.obtain(null, MSG_FROM_CLIENT);// 该消息是发送给客户端进程的
Bundle bundle = new Bundle();
bundle.putString("to", "你好,我已收到你的消息");
message.setData(bundle);
try {
m.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
default:
break;
}
}
}
@Override
public IBinder onBind(Intent intent) {
return messenger.getBinder();
}
在配置文件中注册这个Service,并让其运行在单独的进程中。
<span style="white-space:pre"> </span><service android:name="com.example.Service.MessengerService"
android:process=":remote"></service>
代码还是简单易懂的,服务端进程绑定了binder,在接收到客户端进程消息时,回给客户端进程一个消息。
下面是客户端进程代码。
在ManActivity里启动服务
Intent intent =new Intent(this, BookManagerService.class);
bindService(intent, mAIDLConnection, BIND_AUTO_CREATE);
private void startMessengerService(){
Intent intent =new Intent(MainActivity.this,MessengerService.class);
bindService(intent, connection, BIND_AUTO_CREATE);
}
private Messenger messenger =new Messenger(new ClientHandler());
private class ClientHandler extends Handler{
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_FROM_SERVICE:
//接收服务端发来的消息
Toast.makeText(MainActivity.this, msg.getData().getString("to"), Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
}
private ServiceConnection connection =new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Messenger messenger =new Messenger(service);
Message message =Message.obtain(null, MSG_TO_SERVICE);
Bundle data =new Bundle();
data.putString("from", "我来自客户端");
message.setData(data);
message.replyTo=messenger;
try {
messenger.send(message);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
运行,就能看到服务进程和客户端进程交流成功了。