什么是START_STICKY,START_NOT_STICKY和START_REDELIVER_INTENT服务

时间:2012-12-27 12:19:02

标签: android android-intent

我无法理解

  1. START_STICKY,
  2. START_NOT_STICKY和
  3. START_REDELIVER_INTENT
  4. 任何人都可以用例子清楚解释。

    我浏览了this链接,但无法理解。

3 个答案:

答案 0 :(得分:102)

这些与服务有关。我们都知道服务在后台继续运行,它们也会消耗一些内存来执行。

因此,随着更多应用程序在Android设备上运行,设备内存不断变低,当时间到来时,当设备内存严重不足时,android系统开始终止进程​​,从而释放占用的内存通过这些过程。

但是您可能正在使用服务执行一些重要任务,这些服务也可能在服务停止时终止。 所以这些概念告诉Android系统当设备内存稳定并准备好重新启动服务时你想要执行什么操作。

对这些的最简单的解释可能是,

START_STICKY-告诉系统在有足够的内存可用时,从低内存中恢复后,创建该服务的新副本。在这里,您将丢失之前可能计算过的结果。

START_NOT_STICKY-告诉系统即使有足够的内存也不要费心重启服务。

START_REDELIVER_INTENT-告诉系统在崩溃后重新启动服务,并重新发送崩溃时存在的意图。

答案 1 :(得分:4)

好吧,我读了你链接中的帖子,它说明了一切。

如果您的服务由于内存不足而被Android杀死,Android会清除一些内存,那么......

  1. STICKY:... Android将重新启动您的服务,因为已设置该特定标志。
  2. NOT_STICKY:... Android不会在乎重新开始,因为该标志告诉Android它不应该打扰。
  3. REDELIVER_INTENT:... Android将重新启动该服务并将相同的意图重新发送给该服务的onStartCommand(),因为该标志也是如此。

答案 2 :(得分:2)

这两个代码仅在手机内存不足时才会生效,并在完成执行之前终止服务。 START_STICKY告诉操作系统在有足够内存后重新创建服务,并再次使用null意图调用onStartCommand()。 START_NOT_STICKY告诉操作系统不要再次重新创建服务。还有第三个代码START_REDELIVER_INTENT告诉操作系统重新创建服务并将相同的意图重新传递给onStartCommand()。

Dianne Hackborn的这篇文章比官方文档更好地解释了这个背景。

来源:http://android-developers.blogspot.com.au/2010/02/service-api-changes-starting-with.html

这里的关键部分是函数返回的新结果代码,告诉系统如果它的进程在运行时被杀死它应该对服务做什么:

  

START_STICKY与之前的行为基本相同,其中   服务保持“启动”状态,稍后将由系统重新启动。   与以前版本的平台的唯一区别是它   如果由于其进程被终止而重新启动,onStartCommand()   将使用null Intent在服务的下一个实例上调用   而不是根本不被召唤。使用此模式的服务应该   总是检查这个案子并妥善处理。

     

START_NOT_STICKY说,从onStartCreated()返回之后,如果   该进程被杀死,没有剩余的启动命令要传递,   然后服务将停止而不是重新启动。这样做了   对于那些只打算运行的服务更有意义   执行发送给他们的命令。例如,可以启动服务   从警报每15分钟轮询一些网络状态。如果它得到   在做这项工作时被杀,最好是让它成为现实   下次报警发生时停止并开始运行。

     

START_REDELIVER_INTENT就像START_NOT_STICKY,除非是   服务的进程在调用给定的stopSelf()之前被终止   意图,该意图将在完成之前重新发送给它   (除非经过多次尝试后仍无法完成,否则   系统放弃了哪一点)。这对于那些服务很有用   接收要做的工作命令,并希望确保他们这样做   最终完成发送的每个命令的工作。