START_STICKY和START_NOT_STICKY

时间:2012-02-01 09:12:28

标签: android android-service

在android中实现服务时START_STICKYSTART_NOT_STICKY有什么区别?有人能指出一些标准的例子吗??

5 个答案:

答案 0 :(得分:338)

这两个代码仅在手机内存不足时才会生效,并在完成执行之前终止服务。 START_STICKY告诉操作系统在有足够内存后重新创建服务,并再次使用空意图调用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()之前被终止   意图,该意图将在完成之前重新发送给它   (除非经过多次尝试后仍无法完成,否则   系统放弃了哪一点)。这对于那些服务很有用   接收要做的工作命令,并希望确保他们这样做   最终完成发送的每个命令的工作。

答案 1 :(得分:92)

KISS回答

差异:

START_STICKY

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

START_NOT_STICKY

系统将尝试在服务被杀后重新创建

标准示例:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}

答案 2 :(得分:23)

START_STICKYSTART_NOT_STICKY的文档非常简单。

START_STICKY:

  

如果此服务的进程在启动时被终止(之后)   从onStartCommand(Intent, int, int))返回,然后将其保留   启动状态,但不保留此意图。后来的   系统将尝试重新创建服务。因为它是在开始   州,它将保证致电onStartCommand(Intent, int, int)   创建新服务实例后;如果没有任何待处理的   启动要传递给服务的命令,将调用它   一个空的intent对象,所以你必须注意检查这个。

     

此模式适用于将明确启动的内容   停止运行任意时间段,例如服务   表演背景音乐播放。

示例:Local Service Sample

START_NOT_STICKY:

  

如果此服务的进程在启动时被终止(之后)   从onStartCommand(Intent, int, int))返回,但没有   新的开始意图交付给它,然后把服务拿出来   启动状态,直到将来显式调用时才重新创建   Context.startService(Intent)。该服务不会收到   onStartCommand(Intent, int, int)使用null意图调用,因为   如果没有待处理的意图交付,它将不会重新启动。

     

这种模式对于想要做一些工作的事情是有意义的   启动时,但在内存压力下可以停止   将在以后再次明确地开始自己做更多的工作。一个例子   这样的服务将是一个从服务器轮询数据的服务:它   通过发出警报,可以安排警报每隔N分钟进行一次   开始服务。当它onStartCommand(Intent, int, int)时   从警报中调出,它会在N分钟后安排一个新警报,   并产生一个线程来进行网络连接。如果它的进程被杀死了   在进行检查时,服务将不会重新启动,直到   警报响起。

示例:ServiceStartArguments.java

答案 3 :(得分:0)

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

答案 4 :(得分:-3)

START_STICKY用于根据需要明确启动和停止的服务,而START_NOT_STICKY或START_REDELIVER_INTENT用于仅在处理发送给它们的命令时保持运行的服务。