服务:如果你想在后台执行某些操作,服务将始终在后台运行,即使应用程序关闭。您可以在单独的进程中创建此服务,并且如果您希望,还可以将您的服务提供给其他应用程序。下载任何内容或音乐是一个好例子。
广播接收器:通常系统会发送一些信息,如果您愿意注册,您的应用程序可以接收到这些信息。通过使用onReceive方法,当发生某些事情时,您可以执行想要的操作。例如,当新短信到达或启动完成时,系统将发送BroadcastReceiver。
这里有一篇很好的文章:服务和广播接收器
Service
用于在后台执行某些操作,可以使用它来执行任何长时间运行的进程。例如,当您的应用程序关闭时,您想播放音乐。在这种情况下,服务将在后台运行并播放音乐。
BroadcastReceiver
用于在事件发生时触发某些内容或代码。例如,事件可能是设备启动。如果您想在设备启动、日期和时间更改等情况下执行某些操作...
我以可能有不同的方式来思考这个问题。一个服务接收到专门发送给你的应用程序的意图,就像一个活动一样。一个广播接收器接收到在设备上安装的所有应用程序广播的意图。
(我之所以说服务有点像活动是因为:你不会向所有安装在设备上的应用程序广播一条消息,说“启动活动MyActivity
”。它只针对你特定的应用程序。)
当然,正如其他人提到的,服务可以在后台继续运行,而广播接收器应该尽快完成(例如,如果它运行超过5秒,操作系统可能会将其终止)。广播接收器仍然可以在后台运行(当应用程序关闭时),但在某些情况下。值得一提的是,实际上有两种类型的广播接收器 - 声明在清单中的广播接收器和在上下文中注册的广播接收器。它们具有不同的生命周期和限制 - 前者可以在后台接收广播,但有一定的限制,而后者不能在后台接收广播(应用程序必须运行和活动),但对可以接收的意图类型没有限制。
服务和广播接收器都必须通过意图(intent)被特定地调用,但对于服务来说,这通常是一个特定的调用(例如当您的应用程序启动或用户单击某个按钮时),而对于广播接收器来说,它们不需要明确启动,因为它们将在相关广播发生时自动启动。
以下是我对此的想法:
类型 | 显示UI? | 能在应用关闭后继续运行很长时间吗? | 能在应用关闭后接收意图吗? | 意图必须专门针对您的应用程序吗? | 可以指定的意图受限吗? |
---|---|---|---|---|---|
活动 | 是 | 否 | 是 | 是 | 否 |
服务 | 否 | 是 | 是 | 是 | 否 |
清单声明的广播接收器 | 否 | 否 | 是 | 否 | 是1 |
上下文注册的广播接收器 | 否 | 否 | 否 | 否 | 否 |
1: 仅当您的目标是Android 8.0或更高版本时才会受到限制。如果意图特别针对您的应用程序,则不适用限制。 受限意图的清单可以在这里找到。
Service
。在客户端,他们有两个服务GcmListenerService
和InstanceIdListenerService
- 当然我们需要在这里使用服务,以便它们可以在后台运行,但在这种情况下,它们的行为类似于广播接收器,有类似于OnReceive
的回调,并且会针对某些广播Intent
(通过IntentFilter
指定)触发。 - King King