Android服务的START_STICKY标志的精确语义

时间:2014-09-28 00:51:10

标签: android android-service

不知何故,我很难解析START_STICKY标志的official description

  

从onStartCommand(Intent,int,int)返回的常量:如果是这样   服务的进程在启动时被终止(在返回之后)   onStartCommand(Intent,int,int)),然后将其保持在启动状态   但不要保留这个意图。稍后系统会尝试   重新创建服务。因为它处于启动状态,它会   保证在创建后调用onStartCommand(Intent,int,int)   新服务实例;如果没有任何挂起的启动命令   如果被传递给服务,它将被调用null意图   对象,所以你必须注意检查这个。

     

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

具体来说,以下四个部分没有技术意义(也就是让我去WTF):

  • “如果此服务的进程被终止......,则将其保持在已启动状态” [如何保留在启动状态下被杀死的内容?]
  • “稍后系统将尝试重新创建服务。因为它处于启动状态,...” [如果系统尝试重新启动,为什么它处于启动状态 - 创建服务?]
  • “因为它处于启动状态,它将保证调用onStartCommand(...)......” [“它将保证调用”?对不起,不能用语言解析那个短语]
  • “此模式适用于明确启动和停止运行任意时间段的事项,......” [“并停止运行” ??]

有没有人对此标志有更好的规格?并且,对于任何阅读此内容的Google员工:wtf?你能在内部修复吗?

2 个答案:

答案 0 :(得分:1)

START_STICKY and START_NOT_STICKY

  

START_STICKY告诉操作系统在有足够内存后重新创建服务并再次使用null intent调用onStartCommand()

答案 1 :(得分:1)

如您所知,Android中有两种服务形式:

理解描述的关键是 Started service 必须管理自己的生命周期,即可以停止服务的 ONLY 组件是服务通过调用 stopSelf() 来调用 stopService() 或其他组件。一旦 Started service 启动( onStartCommand() 返回),它就处于启动状态,除非,否则它不会停止调用stopSelf() stopService() 。因此,如果系统过早杀死了服务( stopSelf() stopService() 已被调用),则该服务仍被视为开始状态。您可以通过在 onStartCommand() 中返回一个标记来告诉系统如何继续使用该服务(发信号通知)。

Extending the Service class末尾给出的START_STICKY标志的描述可能会更清楚。

P.S。关于"并停止运行??" 混淆,尝试将其读作" ...明确启动和停止以便运行... "

修改

另请查看this question