前言
在Android中,IPC的方式有很多种,之前我都没听说过Messenger,但是通过近期学习后,我发现它也是一种Android常用的IPC方式,底层是AIDL。
特此记录有关学习
demo的github链接:https://github.com/LJHnb666666/MessengerDemo
1.Messenger介绍
Messenger其实是对AIDL的一层封装。看到Messenger,就不由自主地感觉它和Message有关。确实,而且还和Handler有密切的关系。具体的实现是,Messenger调用send方法,发送携带了data的Message对象,然后交由Handler去处理。
注意
Messenger只适用于多进程单线程的情况,它一次只处理一个请求,服务端并不存在并发执行的情形。所以也不用考虑线程同步的问题(其实这就是Handler消息机制中Message的执行特点了)
但是如果需要多线程去处理,Messenger就不适用了
2.简单的使用思路
在客户端,
①通过bindService绑定Service
②在ServiceConnection的回调方法onServiceConnected中,通过messenger = new Messenger(iBinder);来创建客户端这边的Messenger(binder使用的是Service端返回的)
③创建Bundle,装入数据,并通过message.setData(bundle);放入Message
④messenger.send(message);方法,发送消息。
这样,消息就发送到Service端了
在Service
①创建处理Message的MyHandler。重写handlerMessage,在里面处理客户端发来的Message
②在onBind方法中,首先通过messenger = new Messenger(new MyHandler());创建Messenger,然后通过messenger.getBinder();返回Messenger的IBinder。
下面来看具体代码
①创建Service,并另起进程


②创建客户端(Activity就可以充当客户端)
/**
* Created by didiwei on 2022/5/9
* desc: 一个简单的Messenger使用实例,在这个例子中,服务端无法返回给客户端数据
*/
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
Button bindService;
Button sendToService;
ServiceConnection serviceConnection;//连接Service的回调接口
Messenger messenger;//根据Service返回的IBinder创建的Messenger
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindService =

本文介绍了Android中的一种常见IPC方式——Messenger,它基于AIDL封装,适合多进程单线程场景。通过详细步骤展示了如何在客户端和服务端使用Messenger进行通信,包括创建Service、绑定Service、创建Handler及发送消息。同时,文中还提到了如何实现Service端回复消息的功能,提供了一个完整的Messenger Demo项目链接供读者参考。
最低0.47元/天 解锁文章
810

被折叠的 条评论
为什么被折叠?



