移步Android跨进程通信IPC
使用流程
1.服务端内创建Handler实例,以Handler实例为参数创建Messenger,Messenger持有
IMessenger
aidl对象。
2.在服务端Service内返回Binder对象。
3.客户端绑定服务端,并通过方法回调内的参数Binder生成IMessenger
的aidl对象。
4.通过生成的Messenger实例调用send接口。
代码实例
1. 服务端实例化Handler,以Handler实例为参数创建Messenger
private class MessengerHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case MSG_FROM_CLIENT:
//获取客户端发来的信息
Log.d("wuyazhouMessenger","Messenger获取到的信息:"+msg.getData().getString("msg"));
break;
default:
super.handleMessage(msg);
}
}
}
private final Messenger mMessenger = new Messenger(new MessengerHandler());
2. 在服务端Service内返回Binder对象
@Override
public IBinder onBind(Intent intent) {
return mMessenger.getBinder();
}
3. 客户端Client绑定服务Service获取Binder对象,并通过Binder生成Messenger对象
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder serverBinder) {
mMessenger = new Messenger(serverBinder);
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
};
private void initServiceForMessenger(){
Intent intent = new Intent(mContext, MessengerService.class);
mContext.bindService(intent,mConnection, Context.BIND_AUTO_CREATE);
}
initServiceForMessenger();
4. 通过生成的Messenger实例调用send接口
Message msg = Message.obtain(null,MSG_FROM_CLIENT);
Bundle data = new Bundle();
data.putString("msg","hello, Messenger");
msg.setData(data);
mMessenger.send(msg);
说明
Messenger的代码使用上基本上没有什么可注释的,和AIDL使用基本上一样,可能还会更简单一些,具体的解析单开一篇文章。
网友评论