使用Messenger的IPC

本文深入探讨Android系统下跨进程通讯的两种主要方式:使用AIDL和Messenger对象。重点阐述如何利用Messenger实现客户端和服务端之间的双向消息传递。包括服务端实例化并重写handleMessage方法用于接收消息,以及客户端如何通过IBinder与服务端建立连接并发送消息。同时解释了如何在服务端返回数据给客户端,以及使用Parcelable接口的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下是个人理解,错的地方希望指正出来,谢谢。

想要跨进程的通讯,有两种方法,一种是使用aidl,这个前面文章有提到。

还有一种是使用Messenger对象,这个对象实现了Parcelable接口。

在服务端的Service中我们要先实例化一个Messenger对象,传入一个Handler,并且重写handleMessage方法,用来处理客户端发来的消息。

然后在onBind方法中返回mMessenger.getBinder();

之后是客户端,客户端想要与之通讯,必须持有服务端的IBinder。

bindService的ServiceConncetion中拿到Messenger对象,可以使用实例化Messenger,把IBinder做参数传入。

实际上在实例化Messenger时,我们客户端持有的是远程的Binder,只是Android系统帮我们拿到了aidl接口。

拿到mMessenger时,就可以mMessenger.send(Message msg);实现通讯了。

那我们应该怎样让服务端来返回数据呢?

我们可以在send之前,让msg.replyTo=Messenger;这是一个新得实例化的Messenger,用来接收服务端的数据,和obj的使用时一样的。

在服务端就可以通过msg.replyTo拿到客户端的Messenger,之后就可以通过Messenger.send();把数据返回给我们的客户端,以达到双向通讯的效果。

而前面说到,我们如果想要发送数据到服务端,使用msg.obj是会出异常的,所以我们必须使用实现parcelable接口的方法来传递数据,还没有搞懂,稍后传上去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值