START_STICKY和START_NOT_STICKY

pra*_*ago 252 android android-service

是什么区别START_STICKY,并START_NOT_STICKY同时在android系统实现服务?有谁可以指出一些标准的例子..?

Fra*_*igh 357

这两个代码仅在手机内存不足时才会生效,并在完成执行之前终止服务. START_STICKY告诉操作系统在有足够内存后重新创建服务并onStartCommand()再次调用null意图.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与之前的行为基本相同,其中服务保持"已启动"状态,稍后将由系统重新启动.与以前版本的平台的唯一区别在于,如果它因为其进程被终止而重新启动,则将在具有空Intent的下一个服务实例上调用onStartCommand(),而不是根本不调用它.使用此模式的服务应始终检查此案例并进行适当处理.

START_NOT_STICKY表示,从onStartCreated()返回后,如果进程被终止且没有剩余的启动命令要传递,则服务将停止而不是重新启动.这对于仅在执行发送给它们的命令时运行的服务更有意义.例如,可以从警报每15分钟启动一次服务以轮询一些网络状态.如果它在执行该工作时被杀死,最好让它停止并在下次警报触发时启动.

START_REDELIVER_INTENT类似于START_NOT_STICKY,除非服务的进程在为给定的intent调用stopSelf()之前被终止,该意图将被重新传递给它直到它完成(除非经过多次尝试后仍然无法完成,系统放弃的时间点.这对于接收要执行的工作命令的服务很有用,并且希望确保它们最终完成所发送的每个命令的工作.

  • 如果你按照"return super.onStartCommand(...);" 您将看到,如果您的目标sdk版本默认情况下小于ECLAIR(API5 = 2.0),则返回START_STICKY_COMPATIBILITY,并返回2.0及以上START_STICKY. (3认同)
  • @FrankLeigh我不同意`START_REDELIVER_INTENT`就像`START_NOT_STICKY`.相反,它就像`START_STICKY` (3认同)
  • 但是,如果没有指定,则默认标志是什么? (2认同)

Ode*_*ner 100

答案

区别:

START_STICKY

系统将在它被杀死后尝试重新创建您的服务

START_NOT_STICKY

系统在杀死后不会尝试重新创建服务


标准示例:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}
Run Code Online (Sandbox Code Playgroud)

  • 这实际上不正确和令人困惑.这是一个错误的说法:"服务被杀",因为你可以认为你引用了stopSelf或stopService,而你明显指的是被杀死的进程.所以你最好在答案中使用单词process. (3认同)

Mar*_*nto 23

文档for START_STICKYSTART_NOT_STICKY非常简单.

START_STICKY:

如果此服务的进程在启动时被终止(在返回之后onStartCommand(Intent, int, int)),则将其保留在启动状态但不保留此传递的意图.稍后系统将尝试重新创建服务.因为它处于启动状态,它将保证onStartCommand(Intent, int, int) 在创建新服务实例后调用;如果没有任何挂起的启动命令要传递给服务,它将使用null intent对象调用,因此您必须注意检查这一点.

此模式适用于将显式启动和停止运行任意时间段的事物,例如执行背景音乐播放的服务.

示例:本地服务示例

START_NOT_STICKY:

如果此服务的进程在启动时被终止(在返回之后onStartCommand(Intent, int, int)),并且没有新的启动意图传递给它,则将服务从启动状态中取出,并且在将来显式调用之前不要重新创建 Context.startService(Intent).将不会收到onStartCommand(Intent, int, int)nullIntent 的 通话,因为如果没有待发送的Intent,它将不会重新启动.

这种模式对于想要在启动时做一些工作的事情是有意义的,但是在内存压力下可以停止并且稍后会再次明确地开始做更多的工作.这种服务的一个例子是轮询来自服务器的数据:它可以N通过让警报启动其服务来安排警报每分钟轮询一次.当onStartCommand(Intent, int, int)从警报中调用它时,它会在N分钟后安排新警报,并生成一个线程来进行网络连接.如果在执行该检查时其进程被终止,则在警报响起之前不会重新启动该服务.

示例:ServiceStartArguments.java


小智 5

    \n
  • START_STICKY:如果服务终止并且传递给该onStartCommand()方法的Intent 数据为 ,它将重新启动服务NULL。这适用于不执行命令而是独立运行并等待作业的服务。
  • \n
  • START_NOT_STICKY:它不会重新启动服务,对于定期运行的服务很有用。仅当有待处理的startService()呼叫时,该服务才会重新启动。它\xe2\x80\x99是在不必要的情况下避免运行服务的最佳选择。
  • \n
  • START_REDELIVER_INTENT:它\xe2\x80\x99s 相同STAR_STICKY,它重新创建服务,调用onStartCommand()传递给服务的最后意图。
  • \n
\n