什么是 START_STICKY、START_NOT_STICKY 和 START_REDELIVER_INTENT 服务

问题描述 投票:0回答:3

我无法理解

  1. START_STICKY,
  2. START_NOT_STICKY 和
  3. START_REDELIVER_INTENT

谁能用例子清楚地解释一下。

我浏览了this链接,但无法清楚地理解它。

android android-intent
3个回答
138
投票

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

随着Android设备上运行的应用程序越来越多,设备内存不断变低,当设备内存严重不足时,Android系统开始终止进程,以释放进程占用的内存。

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

最简单的解释可能是,

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

START_NOT_STICKY-
告诉系统不必重新启动服务,即使它有足够的内存。

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


9
投票

好吧,我读了您链接中的主题,它说明了一切。

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

  1. STICKY:...Android 将重新启动您的服务,因为设置了该特定标志。
  2. NOT_STICKY:...Android 不会关心重新启动,因为该标志告诉 Android 它不应该打扰。
  3. REDELIVER_INTENT:...Android 将重新启动服务并将相同的意图重新传递到服务的
    onStartCommand()
    ,因为再次是标志。

7
投票

这两个代码仅在手机内存不足并在执行完成之前终止服务时才相关。 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() 之前被终止 意图,该意图将被重新传递给它,直到它完成 (除非经过多次尝试后它仍然无法完成,在 系统放弃的点)。这对于以下服务很有用 收到要做的工作的命令,并希望确保他们这样做 最终完成每个发送命令的工作。

© www.soinside.com 2019 - 2024. All rights reserved.