Messenger是跨进程的Handler消息机制。
实际上是对AIDL和Handler的封装。
服务端
public class MessengerServer extends Service {
public static final int MSG_REPORT = 1;
private static final String TAG = "MessengerServer";
private Messenger mMessenger = null;
private MessageHandler mHandler = null;
private HandlerThread mThread = null;
public MessengerServer() {
mThread = new HandlerThread("MessengerThread");
mHandler = new MessageHandler(mThread.getLooper());
mMessenger = new Messenger(mHandler);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mMessenger.getBinder();
}
private class MessageHandler extends Handler {
public MessageHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(@NonNull Message msg) {
switch (msg.what) {
case MSG_REPORT:
String value = (String)msg.obj;
Log.d(TAG, "report " + value);
break;
default:
Log.d(TAG, "Msg received what=" + msg.what);
}
}
}
}
客户端
public class MessengerClient {
private static final String TAG = "MessengerServer";
private Messenger mMessenger = null;
public void bindService(Context context) {
Intent intent = new Intent(context, MessengerServer.class);
context.bindService(intent, new BindConnection(), Context.BIND_AUTO_CREATE);
}
public void report(String value) {
Log.d(TAG, "report " + value);
if (mMessenger != null) {
Message msg = Message.obtain();
msg.what = MessengerServer.MSG_REPORT;
msg.obj = value;
try {
mMessenger.send(msg);
} catch (RemoteException e) {
Log.e(TAG, "Fail to send msg e=" + e);
}
}
}
private class BindConnection implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mMessenger = new Messenger(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.d(TAG, "onServiceDisconnected");
}
}
}
网友评论