这些都与服务有关。我们都知道服务会在后台持续运行,并且它们也会消耗一些内存来执行。
随着Android设备上运行的应用程序越来越多,设备内存不断变低,当设备内存严重不足时,Android系统开始终止进程,以释放进程占用的内存。
但是您可能正在使用服务执行一些重要任务,这些任务也可能会随着服务停止而终止。 所以这些概念是告诉Android系统当设备内存稳定以及准备好重新启动服务时要执行什么操作。
最简单的解释可能是,
START_STICKY-
告诉系统在从低内存状态恢复后,当有足够的内存可用时,创建服务的新副本。在这里您将丢失之前可能计算过的结果。
START_NOT_STICKY-
告诉系统不必重新启动服务,即使它有足够的内存。
START_REDELIVER_INTENT-
告诉系统在崩溃后重新启动服务,并重新传递崩溃时存在的意图。
好吧,我读了您链接中的主题,它说明了一切。
如果你的服务由于内存不足而被Android杀死,并且Android清除了一些内存,那么...
onStartCommand()
,因为再次是标志。这两个代码仅在手机内存不足并在执行完成之前终止服务时才相关。 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() 之前被终止 意图,该意图将被重新传递给它,直到它完成 (除非经过多次尝试后它仍然无法完成,在 系统放弃的点)。这对于以下服务很有用 收到要做的工作的命令,并希望确保他们这样做 最终完成每个发送命令的工作。