使用Messenger实现进程间通信(IPC)
Messenger是一种轻量级IPC机制,它基于进程间的消息传递来实现通信。在服务中创建一个Messenger对象,然后把这个Messenger对象的Binder返回给客户端。客户端通过这个Binder来发送消息给服务端,服务端通过自己创建的Handler来接收处理消息。
首先,在服务端创建一个Handler类,该类用来接收客户端发送的请求:
private static class IncomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
// TODO: 处理不同的请求
}
}
}
然后,创建Messenger对象,并将其对应的Binder返回给客户端。客户端收到Binder后,可以创建自己的Messenger对象,并通过该对象向服务端发送消息。
public class MessengerService extends Service {
private final Messenger mMessenger = new Messenger(new IncomingHandler());
@Override
public IBinder onBind(Intent intent) {
// 返回Messenger对应的Binder
return mMessenger.getBinder();
}
}
客户端代码如下所示:
public class MainActivity extends AppCompatActivity {
private Messenger mMessenger;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 绑定服务
Intent intent = new Intent(this, MessengerService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
// 创建Messenger对象
mMessenger = new Messenger(iBinder);
// 发送消息到服务端
Message msg = Message.obtain();
msg.what = 1;
try {
mMessenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
mMessenger = null;
}
};
}
通过Messenger实现IPC通信,可以避免使用AIDL而导致的复杂性、繁琐性。但是,由于Messenger是基于异步消息传递来实现通信的,因此需要注意处理好并发的问题。