文章目录
Android系统跨进程通信–Messenger
1.简介
跨进程通信的方式之一,简化AIDL的繁琐,提升开发效率。
2.Messenger用法
服务端我们实现一个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();
}
}
3.跨进程调用Messenger进行通信
跟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,是
测试客户端发送消息给服务端
服务端发送消息给客户端
完毕。
4.Messenger对AIDL的原理包装(基于android-10.0.0_r41分析)
其实底层是AIDL实现的。
可以看出是可序列化传递的一个对象
通过send方法来跨进程发送消息的
利用handler来构造对象
跟进getIMessenger();方法
很明显就是就是AIDL文件,在服务端实现了send方法,最终是调用这里。
搜索也可以看出它是一个AIDL文件类型的接口。