START_STICKY和START_NOT_STICKY

在android中实现服务时, START_STICKYSTART_NOT_STICKY什么区别? 任何人都可以指出一些标准的例子..?

这两个代码只有在手机内存不足并在完成执行之前终止服务时才适用。 START_STICKY告诉操作系统在有足够的内存后重新创build服务,并以null意图再次调用onStartCommand()START_NOT_STICKY告诉操作系统不要再次重新创build服务。 还有第三个代码START_REDELIVER_INTENT告诉操作系统重新创build服务,并将相同的意图重新传递给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分钟从一个警报开始一个服务来轮询一些networking状态。 如果在做这件事的时候被杀死了,最好是让它停下来,然后在下一次警报起火的时候开始。

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

KISS回答

区别:

START_STICKY

系统会在死亡后尝试重新创build您的服务

START_NOT_STICKY

在系统死亡后,系统不会尝试重新创build服务


标准示例:

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

START_STICKYSTART_NOT_STICKY的文档非常简单。

START_STICKY:

如果此服务的进程在启动时(从onStartCommand(Intent, int, int))返回后)被onStartCommand(Intent, int, int)) ,则将其保留在启动状态,但不保留此传递的意图。 稍后系统将尝试重新创build服务。 因为它处于开始状态,所以在创build新的服务实例后,将保证调用onStartCommand(Intent, int, int) 如果没有待处理的启动命令被传送到服务,它将被调用一个空的intent对象,所以你必须小心检查这一点。

这种模式对于明确启动和停止运行任意时间段的事情是有意义的,例如执行背景音乐播放的服务。

示例: 本地服务示例

START_NOT_STICKY:

如果此服务的进程在启动时(从onStartCommand(Intent, int, int))返回后)被onStartCommand(Intent, int, int)) ,并且没有新的启动意向传递给它,则服务退出启动状态,不要重新创build直到将来显式调用Context.startService(Intent) 。 该服务将不会收到带有null Intent的onStartCommand(Intent, int, int)调用,因为如果没有未完成的要传递的内容,它将不会重新启动。

这种模式对于想要开始工作的人来说是有意义的,但是在内存压力下可以停下来,并且会在稍后再明确地开始做更多的工作。 这种服务的一个例子就是轮询来自服务器的数据:它可以通过让警报开始其服务来安排警报来每隔N分钟轮询一次。 当它从报警中调用onStartCommand(Intent, int, int) ,会在N分钟后安排一个新的报警,并产生一个线程进行联网。 如果在检查过程中进程被终止,服务将不会重新启动,直到告警消失。

例如: ServiceStartArguments.java

最常见的重新启动int值由以下Service静态字段定义:

  • START_STICKY:如果服务进程被系统终止,则服务将被重新启动,并且没有处理的意图将被传送到onStartCommandfunction。 当没有启动意图待交付时,空的Intent被传递给onStartCommand函数。 如果在系统START_FLAG_RETRY服务之前没有返回启动请求,则在重新启动的服务上再次提交启动请求,并在onStartCommand第二个参数上传递START_FLAG_RETRY
  • START_NOT_STICKY:如果服务被系统终止,则只有当至less有一个待处理的开始请求被传送时才会重新启动服务。
  • START_REDELIVER_INTENT:如果服务被系统终止,则服务将被重新启动,重新传送最后传送的开始意图和所有待处理的请求。 这种服务类似于START_STICKY ,但不是在start命令中提供一个null Intent,而是分派最后一个成功发送的Intent。 当启动请求被重新发送时,标志FLAG_REDELIVERY被传入onStartCommand第二个参数。

在主线程上执行的onStartCommand是服务的入口点,因此,如果在服务上执行长时间运行的操作,将操作插入后台线程对于保持应用程序响应性至关重要。