赞
踩
跨进程通信的方式之一,简化AIDL的繁琐,提升开发效率。
服务端我们实现一个Messenger,搞一个handle处理客户端发给服务端的消息,
@SuppressLint("Registered") public class MyMessenger extends Service { private MyHandle mMyHandle = new MyHandle(); //mMyHandle构造一个Messenger对象出来, private Messenger messenger = new Messenger(mMyHandle); private static final String TAG = MyMessenger.class.getSimpleName(); static class MyHandle extends Handler { @Override public void handleMessage(@NonNull Message msg) { if (msg.what == 1) { Log.e(TAG, "handleMessage: qfh"); Messenger sendMsgFromClient = msg.replyTo; //发给客户端的信息 Message sendToMsgFromService = Message.obtain(); sendToMsgFromService.what = 3333; try { //发送消息 sendMsgFromClient.send(sendToMsgFromService); } catch (Exception e) { } } super.handleMessage(msg); } } //跟客户端通信所返回的IBinder对象 @Nullable @Override public IBinder onBind(Intent intent) { return messenger.getBinder(); } }
跟aidl是差不多的只不过换成了Messenger
获取了服务端的IBinder对象后,在客户端要转一下,
Messenger serviceMsg = null;
serviceMsg = new Messenger(service);
客户端拿到这个对象后,就可以通过它也可以给服务端发送消息,
用法replyTo,Messenger类型。
意思就是把client这个Messenger的对象包装在Message中然后打包发送给服务端,
Messenger client = new Messenger(mMyHandle);
Message msgToServer = Message.obtain();
msgToServer.replyTo = client;
在服务端这个就是客户端传递过来的client,是
测试客户端发送消息给服务端
服务端发送消息给客户端
完毕。
其实底层是AIDL实现的。
可以看出是可序列化传递的一个对象
通过send方法来跨进程发送消息的
利用handler来构造对象
跟进getIMessenger();方法
很明显就是就是AIDL文件,在服务端实现了send方法,最终是调用这里。
搜索也可以看出它是一个AIDL文件类型的接口。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。