Messager是一种轻量级的IPC方案,它的底层实现AIDL,由于他一次处理一个请求,因此在服务端不用考虑线程同步问题
1.服务端继承
首先,在服务端创建一个Service来处理客户端请求,同时创建一个Handle并通过他来创建一个Messager对象,然后在Service的onBind中返回这个Messager对象底层的Binder即可
2.客户端进程
首先要绑定服务端的Service,绑定成功后用服务端返回的IBinder对象创建一个Messager,通过这个Messager就可以像服务端发送消息,消息类型为Message对象。如果需要服务端能够回应客户端,就和服务端一样,还需创建一个Handler并创建一个新的Messager,并把这个Messager通过Message的replyTo参数传递给服务端,服务端通过这个replyTo参数就可以回应客户端
eg
public class MessagerService extends Service{
private static final String TAG = "MessagerService";
private static class MessagerHandle extends Handler{
@override
public void handleMessage(Message msg){
switch(msg.what){
case MyConsts.MSG_FROM_CLIENT:
Log.i(TAG,"receive msg from Client:" + mag.getData().getString("msg"));
Messager client = msg.replyTo;
Message replyMessage = Message.obtain(null,MyConstants.MSG_FROM_SERVICE);
Bundle bundle = new Bundle();
bundle.putString("reply","dddddd")
replyMessage.setData(bundle);
try{
client.sent(replyMessage);
}catch{
e.printStackTrace();
}
break;
default:
sper.handleMessage(msg);
}
}
}
private final Messager mMessager = new Messager(new MessagerHandler());
@override
public IBinder onBind(Intent intent){
return mMessager.getBinder();
}
}
public class MessagerActivity extands Activity{
private static final String TAG = "MessagerActivity";
private Messager mService;
private Messager mGetReplyMessager = new Messager(new MessagerHandler());
private static class MessagerHandler extends Handler{
@override
public void handleMessage(Message msg){
switch(msg.what){
case MyConstants.MSG_FROM_SERVICE:
Log.i(TAG,"receiver msg from service:",msg.getData().getString("reply"));
default:
super.handleMessage(msg);
}
}
}
private ServiceConnection mConnection = new ServiceConnection(){
public void onServiceConnection(ComponentName className,IBinder service){
mSerice = new Messager(service);
Message msg = Message.obtain(null,MyConnections.MSG_FROM_FROM);
Bundle data = new Bundle();
data.putString("msg","hellow,this is client");
mag.setData(date);
msg.replyTo = mGetReplyMessager
;
try{
mService.send(msg);
}catch(RemoteException e){
e.printStackTrack();
}
}
public void onServiceDisconnected(Conponement className){
}
}
@override
protected void onCreate(Bundle saveInstanceState){
super.onCreate(saveInstaceState);
setContentView(R.layout.activity_messenger);
Intent intent = new Intent(this,MessagerService);
bindService(intent,mConnection,Contenxt.BIND_AUTO_CREATE);
}
@override
protected void onDestory(){
unbindService(mConnection);
super.onDestory();
}
}
Message中能够使用的载体只有what1,what2,args2,Bundle以及replyTO,Message中海还有另外一个字段object,但是在Android2.2以前object字段不支持跨进程传输,这意味着,我们自定义的Parcelable对象是无法通过object字段来传输的