Messenger可以被翻译为信使,通过它可以在不同进程中传递Message对象。在message中放入需要传递的数据,就可以实现数据在进程中传递。Messenger是一种轻量级的IPC方案,底层实现还是AILD,具体见构造方法。
public Messenger(Handler target) {
mTarget = target.getIMessenger();
}
public Messenger(IBinder target) {
mTarget = IMessenger.Stub.asInterface(target);
}
一、对于Messenger的使用先从原理图开始
二、实现Messenger的具体步骤
服务端进程
服务端需要创新一个Server来处理客户端的连接请求,同事创建一个Handler并通过它创建一个Messenger对象,然后在Server的onBind中返回Messenger底层的Binder即可。客户端进程
首先需要绑定服务,连接成功之后使用服务端返回的IBinder对象创建一个Messenger对象,通过这个Messenger对象可以传递Message对象。
如果需要服务端回应客户端,则需要向服务端一样,创建一个Handler和一个由它构造出来的Messenger,并将这个Messenger对象通过Message.replyTo=Messenger
传递给服务端。之后服务端就可以获取Message利用同样的方法实例化一个Messenger,之后就可以给服务端传递信息,并由Handler处理。代码
服务端
public class MessengerService extends Service {
public static final String TAG = MessengerService.class.getSimpleName();
private final Messenger mMessenger = new Messenger(new MessengerHandler());
public MessengerService() {
}
@Override
public IBinder onBind(Intent intent) {
//获取messenger的binder对象返回给客户端使用
return mMessenger.getBinder();
}
public static class MessengerHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MyConstants.MSG_FROM_CLIENT:
Log.e(TAG, "来自客户端的消息" + msg.getData().getString("msg"));
//给客户端做出回应
Message message = Message.obtain(null, MyConstants.MSG_FROM_SERVER);
Bundle data = new Bundle();
data.putString("msg", "亲!你已经成功连上服务器了!");
message.setData(data);
try {
msg.replyTo.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
default:
super.handleMessage(msg);
}
}
}
}
客户端
public class MainActivity extends AppCompatActivity {
public static final String TAG = MainActivity.class.getSimpleName();
private Messenger mServer, mClient;
private Intent mIntent;
private ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//连接成功,使用服务端传递过来的Ibinder对象实例化messenger
mServer = new Messenger(service);
Message message = Message.obtain(null, MyConstants.MSG_FROM_CLIENT);
Bundle data = new Bundle();
data.putString("msg", "来自客户端的消息");
message.setData(data);
//将客户端的messenger传递给服务端,以便服务端响应客户端
message.replyTo = mClient;
try {
mServer.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mIntent = new Intent(this, MessengerService.class);
mClient = new Messenger(new MyHandler());
}
public void bindServer(View view) {
//绑定服务
bindService(mIntent, mServiceConnection, BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(mServiceConnection);
}
private class MyHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
//来自服务器的回应
case MyConstants.MSG_FROM_SERVER:
Log.e(TAG, "来自服务器的消息" + msg.getData().get("msg"));
break;
default:
super.handleMessage(msg);
}
}
}
}