什么是START_STICKY、START_NOT_STICKY和START_REDELIVER_INTENT服务

68

我无法理解

  1. START_STICKY,
  2. START_NOT_STICKY 和
  3. START_REDELIVER_INTENT

能否有人用例子清楚地解释一下。

我查看了此链接,但仍然无法理解。

3个回答

138
这些与服务有关。我们都知道服务在后台持续运行,并且它们还会消耗一些内存来执行。
随着更多应用在安卓设备上运行,设备内存不断减少,当设备内存严重不足时,安卓系统会开始终止进程,以释放进程占用的内存。
但是你可能正在使用服务执行一些重要任务,当服务停止时,这些任务也可能被终止。所以这些概念是告诉安卓系统在设备内存稳定并准备重新启动服务时要执行的操作。
对这些概念最简单的解释是: START_STICKY- 告诉系统在内存充足时创建一个新的服务副本,从低内存恢复后。在这种情况下,之前可能计算出的结果将会丢失。 START_NOT_STICKY- 告诉系统即使有足够的内存,也不要重新启动服务。 START_REDELIVER_INTENT- 告诉系统在服务崩溃后重新启动服务,并重新传递崩溃时存在的意图。

返回代码(例如START_STICKY或START_NOT_STICKY)是否对Android选择要终止的服务有任何影响? - jmng
1
@derelict:不,这与Android如何选择要终止的服务无关。每当Android系统内存不足时,它将开始调用服务的**onDestroy()**方法。这些意图(返回代码)仅在系统恢复并具有足够的内存再次启动服务时才有用。 - Sahil Mahajan Mj
@SahilMahajanMj,好的,只是在检查。顺便说一下,当系统内存不足时,不能保证服务的onDestroy()方法会被调用。 - jmng
最好的解释! - Mr.Noob

9

我看了你提供的链接中的帖子,它已经解释得很清楚了。

如果你的服务因为内存不足而被Android杀掉,并且Android清理了一些内存,那么...

  1. STICKY: ...Android将重新启动你的服务,因为设置了这个特定的标志。
  2. NOT_STICKY: ...Android不会关心重新启动,因为该标志告诉Android不必费心。
  3. REDELIVER_INTENT: ...Android将重新启动服务并将相同的意图传递给服务的onStartCommand(),因为再次出现了该标志。

7
这两个代码仅在手机内存耗尽且在执行完成之前杀死服务时才有用。START_STICKY 告诉操作系统在有足够内存时重新创建服务,并再次使用空的 intent 调用 onStartCommand()。 START_NOT_STICKY 告诉操作系统不再重新创建服务。还有第三个代码 START_REDELIVER_INTENT,它告诉操作系统重新创建服务并将相同的 intent 传递给 onStartCommand()。Dianne Hackborn 在这篇文章中更好地解释了背景,比官方文档更详细。该函数返回一个新的结果代码,此处关键部分是告诉系统在运行期间进程被杀死时应该如何处理服务。来源: http://android-developers.blogspot.com.au/2010/02/service-api-changes-starting-with.html
START_STICKY基本上与先前的行为相同,即服务被保留“启动”,并稍后由系统重新启动。与平台先前版本的唯一区别是,如果它因其进程被杀死而重新启动,则onStartCommand()将在下一个服务实例上调用,并使用空Intent,而不是根本不调用。使用此模式的服务应始终检查此情况并适当处理。
START_NOT_STICKY表示,在从onStartCreated()返回后,如果进程被杀死且没有剩余的启动命令要传递,则服务将停止而不是重新启动。这对于只在执行发送到它们的命令时运行的服务更有意义。例如,可以每15分钟从闹钟启动某些网络状态的轮询服务。如果在执行该工作时被杀死,则最好让它停止,并在下次闹钟触发时重新启动。
START_REDELIVER_INTENT类似于START_NOT_STICKY,但是如果服务的进程在为给定意图调用stopSelf()之前被杀死,则该意图将被重新传递,直到完成(除非经过更多尝试后仍无法完成,在这种情况下,系统会放弃)。这对于接收要做的工作命令的服务很有用,并希望确保它们最终完成每个发送的命令的工作。

2
从最后一段来看,我不同意START_REDELIVER_INTENTSTART_NOT_STICKY相似的说法。相反,它更像是START_STICKY - CopsOnRoad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接