【发布时间】:2012-02-11 23:32:53
【问题描述】:
我想知道服务和广播接收器之间的区别,谁能指出一个可以在android移动设备上观察到的例子。 谢谢
【问题讨论】:
我想知道服务和广播接收器之间的区别,谁能指出一个可以在android移动设备上观察到的例子。 谢谢
【问题讨论】:
服务:如果你想在后台做某事,即使应用程序关闭,它也会一直在后台运行。您可以在单独的过程中创建它,也可以根据需要将服务提供给其他应用程序。下载任何内容或音乐就是很好的例子
广播接收器:通常系统会发送一些信息,如果您愿意,您的应用可以通过注册接收这些信息。当事情发生时,您可以使用 onReceive 方法做您想做的事情。 示例是当新短信到达或启动完成时系统将发送 BroadcastReceiver
这是一篇好文章:Service and BroadcastReceiver
【讨论】:
Service 用于当你想在后台做某事时,任何长时间运行的进程都可以使用后台服务来完成。例如,您想在应用程序关闭时播放音乐。在这种情况下,服务将在背景音乐中运行。
BroadcastReceiver 用于在某些事件期间触发某些东西或代码。例如,事件可以在设备启动上。如果您想在设备启动、日期和时间更改等时执行某些操作...
【讨论】:
Service 的用法。在客户端,它们有 2 个服务 GcmListenerService 和 InstanceIdListenerService - 当然我们需要在这里使用服务,以便它们可以在后台运行,但在这种情况下它们的行为 很像 BroadcastReceiver 的作用是,有类似于OnReceive 的回调,它们会根据Intent(通过IntentFilter 指定)的某些广播触发。
我认为这可能是另一种方式。 Service 接收专门发送到您的应用程序的意图,就像 Activity 一样。 广播接收器接收在系统范围内向设备上安装的所有应用广播的意图。
(我说 Service 有点像 Activity 的原因是:您不会在设备上安装的所有应用程序中广播“启动 Activity MyActivity”的消息。它仅适用于您的特定应用程序。 )
当然,正如其他人所提到的,服务可以在后台继续运行,而广播接收器应该快速完成(例如,如果它运行超过 5 秒,它可能会被操作系统杀死)。在某些情况下,广播接收器仍然可以在后台运行(当应用程序关闭时)。为此,值得一提的是,实际上有两种类型的广播接收器——清单声明的和上下文注册的。它们有不同的生命周期和限制——前者可以在后台接收广播,但有一定的限制,而后者不能在后台接收广播(应用程序必须正在运行且处于活动状态),但对可以接收的意图类型没有限制。
必须专门调用服务和广播接收器(通过意图),但对于服务,这通常是特定调用(例如,当您的应用启动时或当用户单击某个按钮时),而对于广播接收器,它们不会需要明确启动,因为它们无论如何都会在进行相关广播时启动。
这是我的想法:
| Type | Displays UI? | Can continue running for a long time when app is closed? | Can receive intents when app is closed? | Intents must specifically target your app? | Restricted list of intents that can be specified? |
|---|---|---|---|---|---|
| Activity | Yes | No | Yes | Yes | No |
| Service | No | Yes | Yes | Yes | No |
| Manifest-declared Broadcast Receiver | No | No | Yes | No | Yes1 |
| Context-registered Broadcast Receiver | No | No | No | No | No |
1:仅适用于 Android 8.0 或更高版本。如果意图专门针对您的应用,则不会应用这些限制。可以在here找到受限的意图列表。
【讨论】: