Android语言基础教程(242)Android创建Bound Service实例之使用Messenger类绑定服务显示时间:告别单相思!Messenger让Android服务与界面甜蜜对话

你的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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值