在android中实现服务时,START_STICKY和START_NOT_STICKY之间的区别是什么?谁能举出一些标准的例子??
START_STICKY
START_NOT_STICKY
START_STICKY和START_NOT_STICKY的文档非常简单。
START_STICKY:
如果该服务进程在启动时被杀死(在启动后) 返回onStartCommand(Intent, int, int)),然后保留它 启动状态,但不保留此传递意图。后, 系统将尝试重新创建服务。因为它在开头 状态时,它将保证调用onStartCommand(Intent, int, int) 在创建新的服务实例之后;如果没有任何悬而未决的问题 启动要交付给服务的命令,它将被调用 一个空意图对象,所以你必须小心检查这个 此模式对于将要显式启动和的内容有意义 停止以运行任意时间段,例如服务 .播放背景音乐
如果该服务进程在启动时被杀死(在启动后) 返回onStartCommand(Intent, int, int)),然后保留它 启动状态,但不保留此传递意图。后, 系统将尝试重新创建服务。因为它在开头 状态时,它将保证调用onStartCommand(Intent, int, int) 在创建新的服务实例之后;如果没有任何悬而未决的问题 启动要交付给服务的命令,它将被调用 一个空意图对象,所以你必须小心检查这个 此模式对于将要显式启动和的内容有意义 停止以运行任意时间段,例如服务
onStartCommand(Intent, int, int))
onStartCommand(Intent, int, int)
例如:本地服务样本
START_NOT_STICKY:
如果该服务进程在启动时被杀死(在启动后) 返回onStartCommand(Intent, int, int)),并且没有 New start意图交付给它,然后将服务从 状态,直到将来显式调用 Context.startService(Intent)。服务将不会接收 使用null Intent调用onStartCommand(Intent, int, int),因为 如果没有挂起的intent要交付,它将不会被重新启动 这个模式对于想要做一些功的东西是有意义的 被启动,但可以在内存压力下停止 将显式启动自己以后再做更多的工作。一个例子 这类服务的其中之一是轮询来自服务器的数据:it 可以安排一个闹钟轮询每N分钟有闹钟 启动它的服务。当它的onStartCommand(Intent, int, int)为 从警报中调用,它会在N分钟后安排一个新的警报, 并生成一个线程来进行网络连接。如果它的进程被杀死 在进行该检查时,服务将不会重新启动,直到 . .
如果该服务进程在启动时被杀死(在启动后) 返回onStartCommand(Intent, int, int)),并且没有 New start意图交付给它,然后将服务从 状态,直到将来显式调用 Context.startService(Intent)。服务将不会接收 使用null Intent调用onStartCommand(Intent, int, int),因为 如果没有挂起的intent要交付,它将不会被重新启动 这个模式对于想要做一些功的东西是有意义的 被启动,但可以在内存压力下停止 将显式启动自己以后再做更多的工作。一个例子 这类服务的其中之一是轮询来自服务器的数据:it 可以安排一个闹钟轮询每N分钟有闹钟 启动它的服务。当它的onStartCommand(Intent, int, int)为 从警报中调用,它会在N分钟后安排一个新的警报, 并生成一个线程来进行网络连接。如果它的进程被杀死 在进行该检查时,服务将不会重新启动,直到
Context.startService(Intent)
null
N
例如:ServiceStartArguments.java
这两个代码只在手机内存不足并在服务执行完成之前终止服务时才相关。START_STICKY告诉操作系统在服务有足够的内存后重新创建服务,并以空意图再次调用onStartCommand()。START_NOT_STICKY告诉操作系统不要再费心重新创建服务。还有第三个代码START_REDELIVER_INTENT,它告诉操作系统重新创建服务,并将相同的意图重新传递给onStartCommand()。
onStartCommand()
START_REDELIVER_INTENT
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,除非 service的进程在为给定对象调用stopSelf()之前被杀死 意图,那个意图会被重新传递给它,直到它完成 (除非经过多次尝试,它仍然不能完成,at 系统放弃了这一点)。这对于服务非常有用 收到要做的工作命令,并想要确保他们做到了 . . .
START_STICKY基本上与前面的行为相同,其中 服务未“启动”;稍后将被系统重新启动。 该平台与以前版本的唯一不同之处在于 如果它因为进程被杀死而重新启动,onStartCommand() 在服务的下一个实例中调用null Intent 而不是完全不被召唤。使用此模式的服务应该 总是检查这种情况并适当地处理它
START_NOT_STICKY表示,从onStartCreated()返回后,如果 进程被终止,没有剩余的启动命令要交付, 然后服务将停止,而不是重新启动。这就形成了 对于那些只在某个时间运行的服务来说,有更多的意义 执行发送给他们的命令。例如,服务启动 每15分钟从报警轮询一些网络状态。如果它 在工作中被杀,最好的办法就是顺其自然
START_REDELIVER_INTENT类似于START_NOT_STICKY,除非 service的进程在为给定对象调用stopSelf()之前被杀死 意图,那个意图会被重新传递给它,直到它完成 (除非经过多次尝试,它仍然不能完成,at 系统放弃了这一点)。这对于服务非常有用 收到要做的工作命令,并想要确保他们做到了
的区别:
系统将在服务被终止后尝试重新创建服务
系统将不尝试在服务被杀死后重新创建服务
标准的例子:
@Override public int onStartCommand(Intent intent, int flags, int startId) { return START_STICKY; }
NULL
startService()
STAR_STICKY