Android 广播接收器与服务

标签 android android-service android-broadcast

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

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

广播接收器可以在代码或 list 中注册,并且可以使用 sendBroadcast 调用。

您什么时候会使用一个与另一个?

我知道多个广播接收器可以监听同一个 Intent ,而服务不是这种情况。

最佳答案

服务旨在在一段时间内在后台执行一项操作,而不管用户在前台做什么(用户可能在 Activity 之间切换)。一个很好的例子是音乐播放器服务 - 用户开始通过音乐播放器应用播放音乐,但当他们退出应用时,音乐继续播放。

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

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

当通过 sendBroadcast 广播 Intent 时,它将被发送到具有匹配 Intent 过滤器的 所有 接收器。但是,需要注意的是,在 API26+ 中, list 中注册的大多数接收器在这种情况下不再被调用,请参阅 the Google docs for more information .


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

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

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

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

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

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

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

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

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

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

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

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

关于Android 广播接收器与服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14548927/

相关文章:

安卓 OCR : Application crashes at OCR function(or trying to load library)

Android 电子邮件发送失败,错误为发送失败 : IOException while sending message

android - 如何检查服务中的 Internet 连接以及一旦 Internet 启动服务就应该开始运行

android - 我应该把我的 retrofit 电话和 Android 服务类放在里面吗?

java - AIDL registerCallback() 谷歌文档

android - 广播接收器 - 调用者验证

android - 远程()的实现

android - 图书馆项目中的广播接收器无法正常工作

android - 如何在服务中获取我的应用程序的 widgetID 和 ComponentName

android - 带有 Json Api 的 ReactNative ListView