在android中实现服务时START_STICKY
和START_NOT_STICKY
有什么区别?有人能指出一些标准的例子吗??
答案 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)
差异:
系统将在杀死服务后尝试重新创建服务
系统将不尝试在服务被杀后重新创建
标准示例:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
答案 2 :(得分:23)
START_STICKY
和START_NOT_STICKY
的文档非常简单。
如果此服务的进程在启动时被终止(之后) 从
onStartCommand(Intent, int, int))
返回,然后将其保留 启动状态,但不保留此意图。后来的 系统将尝试重新创建服务。因为它是在开始 州,它将保证致电onStartCommand(Intent, int, int)
创建新服务实例后;如果没有任何待处理的 启动要传递给服务的命令,将调用它 一个空的intent对象,所以你必须注意检查这个。此模式适用于将明确启动的内容 停止运行任意时间段,例如服务 表演背景音乐播放。
如果此服务的进程在启动时被终止(之后) 从
onStartCommand(Intent, int, int))
返回,但没有 新的开始意图交付给它,然后把服务拿出来 启动状态,直到将来显式调用时才重新创建Context.startService(Intent)
。该服务不会收到onStartCommand(Intent, int, int)
使用null
意图调用,因为 如果没有待处理的意图交付,它将不会重新启动。这种模式对于想要做一些工作的事情是有意义的 启动时,但在内存压力下可以停止 将在以后再次明确地开始自己做更多的工作。一个例子 这样的服务将是一个从服务器轮询数据的服务:它 通过发出警报,可以安排警报每隔
N
分钟进行一次 开始服务。当它onStartCommand(Intent, int, int)
时 从警报中调出,它会在N分钟后安排一个新警报, 并产生一个线程来进行网络连接。如果它的进程被杀死了 在进行检查时,服务将不会重新启动,直到 警报响起。
答案 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用于仅在处理发送给它们的命令时保持运行的服务。