前言
在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.ac