1,Messenger 简介
不同进程之间传递message对象,message里面设置传递的数据,实现进程间消息传递。(底层使用是aidl)
2,消息传递基本流程如下
服务器:创建Service处理来自服务器的连接请求,同时创建handler以及Messenger对象,在Service的onBinder方法中返回service底层的IBinder
客户端:绑定Service,并且建立连接,绑定成功后服务器会返回IBinder,通过IBinder创建Messenger对象,发送消息,接收消息,处理消息等。
2,代码逻辑
服务端:
//清单文件进行配置
<service android:name=".MessengerService"
android:process=":remote"/>
//创建Service接收来自服务器的消息等
public class MessengerService extends Service {
private static String TAG = "MessengerService";
private Messenger mMessenger = new Messenger(new MessageHandler());
private class MessageHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
Log.e(TAG, "message from client" + msg.getData().getString("msg"));
replyToClient(msg);//接收到客户端的消息并且返回结果
break;
default:
super.handleMessage(msg);
}
}
}
private void replyToClient(Message msg) {
Messenger messenger = msg.replyTo; //回复客户端
Message message = Message.obtain(null,1);
Bundle bundle = new Bundle();
bundle.putString("msg","来自服务器的数据data");
message.setData(bundle);
try {
messenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mMessenger.getBinder(); //返回来自服务器底层的IBinder
}
}
客户端
//绑定服务
Intent intent = new Intent(this,MessengerService.class);
bindService(intent,mConnection, Context.BIND_AUTO_CREATE);
//服务绑定成功
private Messenger mService;
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mService = new Messenger(service);
Message message = Message.obtain(null,1);
Bundle bundle = new Bundle();
bundle.putString("msg","客户端数据");
message.setData(bundle);
message.replyTo = mMessage;//回复服务器
try {
mService.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
//客户端收到服务器返回的数据
private Messenger mMessage = new Messenger(new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 1:
Log.e(TAG,"MainActivity:"+msg.getData().getString("msg"));
break;
}
}
});
注:bindService(Intent service, ServiceConnection conn, int flags)方法有flag参数,绑定service的行为和行为模式,其中BIND_AUTO_CREATE和BIND_WAIVE_PRIORITY两个flag也就是Android4.0版本前后有一些区别,主要是:
1,在4.0之前,Service的优先级被默认视同后台任务,如果设置了BIND_AUTO_CREATE则Service的优先级将等同于宿主进程,也就是调用bindService的进程。
2,在4.0以后,Service的优先级默认为宿主进程,有设置了BIND_WAIVE_PRIORITY才会使Service的被当做后台任务对待。