Messenger

xiaoxiao2021-02-28  170

使用Messenger

Messenger可以在不同进程间传递Message对象。是一种轻量级的IPC方案,底层实现是 AIDL。 具体使用时,分为服务端和客户端: 1. 服务端:创建一个Service来处理客户端请求,同时创建一个Handler并通过它来创建一个 Messenger,然后再Service的onBind中返回Messenger对象底层的Binder即可;

private final Messenger mMessenger = new Messenger (new xxxHandler());

2. 客户端:绑定服务端的Sevice,利用服务端返回的IBinder对象来创建一个Messenger,通过这个Messenger就可以向服务端发送消息了,消息类型是 Message 。如果需要服务 端响应,则需要创建一个Handler并通过它来创建一个Messenger(和服务端一样),并 通过 Message 的 replyTo 参数传递给服务端。服务端通过Message的 replyTo 参数就可以回应客户端了。 3. 总而言之,就是客户端和服务端 拿到对方的Messenger来发送 Message 。只不过客户端通过 bindService 而服务端通过 message.replyTo 来获得对方的Messenger。 4. Messenger中有一个 Hanlder 以串行的方式处理队列中的消息。不存在并发执行,因此我们不用考虑线程同步的问题。

附上代码

服务端

public class MessengerService extends Service { private static final int MSG_SUM = 0x110; private Messenger messenger; public MessengerService() { } @Override public void onCreate() { super.onCreate(); HandlerThread handlerThread = new HandlerThread("check-message-coming"); handlerThread.start(); messenger = new Messenger(new Handler(handlerThread.getLooper()) { @Override public void handleMessage(Message msgfromClient) { super.handleMessage(msgfromClient); Message msgToClient = Message.obtain(msgfromClient); switch (msgfromClient.what) { case MSG_SUM: { msgToClient.what = MSG_SUM; try { Thread.sleep(1000); msgToClient.arg2 = msgfromClient.arg1 + msgfromClient.arg2; msgfromClient.replyTo.send(msgToClient); } catch (InterruptedException | RemoteException e) { e.printStackTrace(); } break; } } } }); } @Override public IBinder onBind(Intent intent) { return messenger.getBinder(); } }

客户端

public class SingleTaskActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; private static final int MSG_SUM = 0x110; @Bind(R.id.id_tv_callback) TextView idTvCallback; @Bind(R.id.id_btn_add) Button idBtnAdd; @Bind(R.id.root) LinearLayout root; private Messenger mService; private boolean isConn; private Messenger messenger = new Messenger(new Handler() { @Override public void handleMessage(Message msgFromServer) { super.handleMessage(msgFromServer); switch (msgFromServer.what) { case MSG_SUM: { TextView tv = (TextView) root.findViewById(msgFromServer.arg1); tv.setText(tv.getText() + "=>" + msgFromServer.arg2); break; } } } }); private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { mService = new Messenger(iBinder); isConn = true; idTvCallback.setText("connected!"); } @Override public void onServiceDisconnected(ComponentName componentName) { mService = null; isConn = false; idTvCallback.setText("disconnected!"); } }; private int mA; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_single_task); ButterKnife.bind(this); Intent intent = new Intent(this, MessengerService.class); bindService(intent, connection, Context.BIND_AUTO_CREATE); } @OnClick({R.id.button4, R.id.id_btn_add}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.button4: { startActivity(new Intent(this, LaunchModeActivity.class)); break; } case R.id.id_btn_add: { int a = mA++; int b = (int) (Math.random() * 1000); TextView tv = new TextView(this); tv.setText(a + " + " + b + " = caculating ..."); tv.setId(a); root.addView(tv); Message msgFromClient = Message.obtain(null, MSG_SUM, a, b); msgFromClient.replyTo = messenger; if (isConn) { try { mService.send(msgFromClient); } catch (RemoteException e) { e.printStackTrace(); } } break; } } } @Override protected void onDestroy() { unbindService(connection); super.onDestroy(); } }
转载请注明原文地址: https://www.6miu.com/read-35343.html

最新回复(0)