当前位置: 首页 > 工具软件 > Messenger > 使用案例 >

Android-Messenger浅析

刘嘉木
2023-12-01

Messenger(信使)是进程间通信(IPC)的一种方式,是一种轻量级的IPC方案,底层是AIDL,一次只能处理一个请求,不用考虑线程同步,服务端也不存在并发情形。

理解Messenger可以从服务端和客户端来看

1、创建服务端

Handler(处理消息message);

Messenger(接受和发送消息);

Messenger将客户端发来的消息message传递给Hanlder处理,所以在创建Messenger对象的时候将Handler的对象传递到它的构造方法中,使Messenger和Handler相关联,使用如下方法实例化

private class MessengerHanlder extends Handler{
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
    }
}
private Messenger messenger = new Messenger(new MessengerHanlder());

在onBind中返回messenger的Binder对象,以供客户端绑定服务成功后获取binder对象

public IBinder onBind(Intent intent) {
    return messenger.getBinder();
}

这样,我们服务端就创建好了。

2、客户端

客户端向服务端发送消息,首先绑定服务端的服务,记得最后解绑

bindService(intent,mCon, Context.BIND_AUTO_CREATE);

绑定成功后,我客户端的消息怎么发送给服务端呢?至少需要一个通道或者说联系吧,还记得上面服务端提供的Binder对象吗?只要客户端绑定服务端成功了,就能获取到服务端给我们的binder,根据服务端返回的binder对象来创建Messenger对象,并使用这个对象向服务端发送消息,这样客户端和服务端就联系起来了,服务端就能收到客户端发送的消息了

public void onServiceConnected(ComponentName name, IBinder service) {
    Messenger messenger = new Messenger(service);
}

3、服务端回复

有人说了,这只是单向的消息传递,服务端总不能只收消息不回应吧,下面我们就来看看服务端怎么回应消息

客户端也需要创建Handler和Messenger,还记得客户端向服务端发送消息吗?在发送消息message中携带客户端的messenger对象

  Message message = new Message();
  message.replyTo = clientMessenger;

这样,服务端在收到客户端的message的时候,可以获取到客户端的Messenger,并使用这个Messenger向客户端回复消息

Messenger client = msg.replyTo;

 

 类似资料: