START_STICKY和START_NOT_STICKY

在android中实现服务时,START_STICKYSTART_NOT_STICKY之间的区别是什么?谁能举出一些标准的例子??

206850 次浏览

START_STICKYSTART_NOT_STICKY的文档非常简单。

START_STICKY:

如果该服务进程在启动时被杀死(在启动后) 返回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分钟后安排一个新的警报, 并生成一个线程来进行网络连接。如果它的进程被杀死 在进行该检查时,服务将不会重新启动,直到

.

.

例如:ServiceStartArguments.java

这两个代码只在手机内存不足并在服务执行完成之前终止服务时才相关。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,除非 service的进程在为给定对象调用stopSelf()之前被杀死 意图,那个意图会被重新传递给它,直到它完成 (除非经过多次尝试,它仍然不能完成,at 系统放弃了这一点)。这对于服务非常有用 收到要做的工作命令,并想要确保他们做到了

.

.

.

回答

的区别:

START_STICKY

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

START_NOT_STICKY

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


标准的例子:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
  • START_STICKY:如果服务终止,它将重新启动服务,并且传递给onStartCommand()方法的Intent数据是NULL。这适用于不执行命令但独立运行并等待作业的服务。
  • START_NOT_STICKY:它不会重新启动服务,对于定期运行的服务非常有用。只有当有一个悬而未决的startService()调用时,服务才会重新启动。在不必要的情况下避免运行服务是最好的选择。
  • START_REDELIVER_INTENT:它与STAR_STICKY相同,它重新创建服务,用传递给服务的最后一个意图调用onStartCommand()