首页 > 解决方案 > 从 Activity 向 Service 发送消息,反之亦然

问题描述

我以前从未使用过服务,但我查看了很多帖子和教程,但我从来没有完全理解它是如何工作的。

所以我需要的是独立于应用程序生命周期在后台运行以异步接收和执行请求的东西(如服务)。更详细地说,我希望这是一个下载队列。如果用户请求下载,我计划通过启动服务来做到这一点。如果在第一个下载未完成时请求另一个下载,则服务会将其放入其队列中。该服务会定期发送消息,以便更新 UI。用户还可以暂停或取消下载(因此活动必须能够向服务发送消息)。

我知道如何下载东西,我想我知道如何启动服务,但我不明白如何向服务发送消息。
对于 Activity 的消息,我会这样做:

private void sendUpdateMessage(Bundle data) {
    Intent intent = new Intent("DownloadUpdate");
    intent.putExtra("data", data);
    LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
}

对于发往服务的消息,我想必须有某种绑定(我不太理解)。我发现了这个Activity 和 Service 之间的通信或这个https://developer.android.com/reference/android/app/Service.html#remote-messenger-service-sample,但这似乎很复杂,很遗憾我不明白.

如果有人对如何在 Activity 和 Service 之间进行通信有一个简单的说明,那就太好了。
(同样,我知道 Stackoverflow 上有关于这个主题的帖子,但由于某种原因,我不明白如何正确地做到这一点)

标签: androidandroid-service

解决方案


我发现了一个非常有用的页面,里面有很好的例子:
Service and Activity 之间的有效沟通

有三种可能的方式:

  • 广播和广播接收器

    简单的解决方案使用广播和广播接收器。但是,这种方法有以下缺点:
    消息发送者不知道谁将接收数据(它广播消息)。广播会消耗大量带宽,不适合高流量。

  • 粘合剂

    对于在一个应用程序中使用的活动和服务,建议使用“Binder”解决方案。与服务绑定后,Binder 将允许活动(或绑定到服务的其他类)调用服务的任何公共方法。

  • 信使

    对于不同应用程序的进程间通信 (IPC),推荐的活动和服务之间的通信方法是使用 Messenger。在这种情况下,服务为不同的传入消息定义了一个处理程序。然后在 Messenger 中使用此处理程序通过消息传输数据。
    要获得双向通信,该活动还必须注册一个 Messenger 和 Handler。此 Messenger 在其中一条消息中传递给服务。没有这个,服务将不知道它应该响应谁。

对于我的项目,我选择了最后一个。


推荐阅读