81

我试图澄清android中广播接收器和服务之间的区别。

我了解活动可以通过startService意图调用来启动服务。

广播接收器可以在代码或清单中注册,并且可以使用sendBroadcast.

你什么时候使用一个与另一个?

我知道多个广播接收器可以监听相同的意图,而服务并非如此。

4

3 回答 3

117

无论用户在前台做什么(用户可能在活动之间切换),服务都意味着在后台执行某个操作一段时间。一个很好的例子是音乐播放器服务——用户开始通过音乐播放器应用程序播放音乐,但当他们退出应用程序时,音乐继续播放。

服务对于跨多个应用程序提供/管理对资源的公共访问也很有用。这通常用于系统资源,例如传感器。

广播接收器旨在响应意图(通常是由服务或系统事件发送的意图),做某事并完成。这里的一个例子可能是用户将支持 NFC 的手机触摸到标签,系统为其创建一个意图,并且注册的接收器处理它以更改某些设置(更改音量、打开蓝牙等)。

当一个意图通过 sendBroadcast 广播时,它将被发送到所有具有匹配意图过滤器的接收器。但是,重要的是要注意,在 API26+ 中,在清单中注册的大多数接收器在这种情况下不再被调用,有关更多信息,请参阅 Google 文档


示例 1:假设您想要公开一个函数(可从任何想要使用它的应用程序中获得),该函数要求网站计算与 Kevin Bacon 的分离度。

请注意,此示例是“做某事并返回”,而不是执行长时间运行的后台操作。

您可以通过多种方式实现这一点:

创建一个所有用户都编译到他们的应用程序中的库项目。

  • 您的代码现在有多个副本,它们都可能是不同的版本。
  • 您无法批处理或缓存请求,因为每个请求都是独立处理的。

创建一个广播接收器来处理每个请求。

  • 您的应用程序注册一个广播接收器以接受询问培根问题的 Intent
  • 每个应用程序都会发送一个 Intent 来询问问题。
  • 广播接收器接受 Intent 并且
    • 将请求传递给服务进行处理,该服务将 Intent 与结果一起发送给请求者
    • 向服务器发送请求,完成后将使用 Google Cloud Messaging 进行响应
  • 因为所有请求都通过一个应用程序,您可以批处理/缓存结果
  • 这总是异步的
  • API 是“意图”——不是公开功能的最友好方式

创建一个服务来处理每个请求

  • 您的应用程序创建一个服务来处理请求,并通过 Binder 或使用 AIDL 公开 API
  • API 可以是同步的(直接调用并返回)或异步的(允许监听器注册并在结果准备好时调用监听器)。如果预计处理速度非常快,您应该只选择同步;服务器调用应该更频繁地异步处理
  • API 是“方法调用”——一种更友好的公开功能的方式

示例 2:您想要执行一些数据分析以查找数据中的一些模式

后台线程如果所有处理都发生在用户在同一个应用程序和同一个 Activity 中,那么后台线程(或者更好的是协程)将是一个好方法

服务如果您希望允许用户在执行处理时退出应用程序(并在稍后通知他们结果),或者允许他们在执行处理时通过同一应用程序中的多个活动进行,服务将成为更好的方法

于 2013-01-27T15:47:17.163 回答
86

广播接收器

在 Android 开发者博客上引用Dianne Hackborn 的话

处理广播时,应用程序有固定的时间(当前为 10 秒)来完成其工作。如果它没有在那个时间内完成,则认为应用程序行为不端,并且它的进程会立即进入后台状态,以便在需要时被杀死以获取内存。

广播接收器受最大时间限制(通常为 10 秒),它们必须完成。

服务

如果您的操作需要更长的时间(连接到互联网可能需要一些时间)。最好在后台运行。为此,您绝对应该从接收器或 Activity 调用服务。他们最后被安卓操作系统杀死。

结论:

  1. 一般来说,对您的应用程序很重要的所有工作(获取、解析、缓存、更新数据库)都应该转移到,Service因为它们在 Android 上长期存在。正如您几乎认为所有的社交网站都在那里STICKY_SERVICES做所有麻烦的工作。

  2. BroadcastReceiver主要用于启动服务。它通常取决于应用程序。大多数应用程序用于ConnectivityManager在网络处于 UP 或 DOWN 时进行广播。在这些的帮助下,ServiceBroadcastReceiver.

于 2013-01-27T15:48:56.323 回答
6

首先,阅读Broadcast ReceiverServices的文档。

您可以在此处此处找到有用的教程。

最后,长话短说:

服务根据您的请求启动 (startService(intent))。您可以将广播接收器视为意图侦听器。

于 2013-01-27T16:02:39.137 回答