我试图澄清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/