你的Android应用后台服务与前台界面,只差一个Messenger的距离。
还记得那些年我们写过的Android服务吗?有时候像个单相思的暗恋者,界面点了按钮,服务在后台默默工作,却苦于无法把结果实时传递回来。今天,我们就来解锁让服务与界面双向沟通的神技能——Messenger绑定服务。
Messenger就像是Android世界里的专属邮差,在服务和界面之间建立一条通信频道,让它们可以互相发送消息,彻底告别单相思时代!
理解Bound Service:你的应用有个“后台搭档”
在Android应用开发中,我们常常需要让前台界面与后台服务进行通信,比如获取实时数据、执行长时间运行的任务等。
与Started Service(启动式服务)不同,Bound Service更注重组件与服务之间的交互。当一个应用组件通过bindService()方法绑定到服务后,系统会建立一条通信渠道,组件可以直接调用服务中的公共方法。
想象一下,你的Android应用有一个忠实的后台小伙伴,它可以默默地执行任务,只在需要时才与前台界面交流。这就是Bound Service的基本概念。
为什么选择Messenger而不是直接使用AIDL?
看到这里你可能要问:Android进程间通信不是有AIDL吗?为什么还要用Messenger?
简单才是王道! Messenger本质上是对AIDL的高级封装,它省去了编写AIDL文件的繁琐过程,大大简化了代码结构。使用Messenger,你不需要处理多线程同步问题,因为它会将所有调用自动排队,一次只处理一个请求。
与 AIDL 比较:
当您需要执行 IPC 时,为您的接口使用 Messenger 要比使用 AIDL 实现更加简单,因为 Messenger 会将所有服务调用排入队列,而纯粹的 AIDL 接口会同时向服务发送多个请求,服务随后必须应对多线程处理。
对于大多数应用,服务不需要执行多线程处理,因此使用 Messenger 可让服务一次处理一个调用。如果您的服务必须执行多线程处理,则应使用 AIDL 来定义接口。
一句话总结: 除非你需要服务同时处理多个请求,否则Messenger都是更优选择!
Messenger的工作原理:Android世界的小邮差
Messenger的工作机制就像现实生活中的邮政系统:
- Handler = 信件的处理者(收信后决定怎么做)
- Messenger = 邮差(负责送信)
- Message = 信件本身(包含具体内容)
查看Messenger源码可以发现,Messenger包含一个IMessenger的成员变量mTarget,通过mTarget可以向Handler传递Message消息。
两个进程间传递的对象为Messenger对象中的mTarget变量,通过mTarget对象可以跨进程发送Message给Handler:
// Messenger.java
public void send(Message message) throws RemoteException {
mTarget.send(message);
}
实战演练:创建显示时间的Messenger绑定服务
接下来,我们一步步创建一个使用Messenger显示当前时间的Bound Service。这个例子虽然简单,但包含了实现Messenger通信的所有核心概念。
1. 创建服务端(Service)
首先创建我们的服务类,它负责处理获取时间的请求:
public class CurrentTimeService extends Service {
public static final int CURRENT_TIME = 0;
// 创建Handler处理来自客户端的消息
private class IncomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
if (msg.what

最低0.47元/天 解锁文章

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



