Service#onStartCommand返回值解析
Service
类有个生命周期方法叫onStartCommand
,每次启动服务(startService)都会回调此方法。此方法的原型例如以下:
public int onStartCommand(Intent intent, int flags, int startId)
须要关注的是这种方法有一个整型的返回值,它有下面选项:
START_STICKY_COMPATIBILITY
START_STICKY
START_NOT_STICKY
START_REDELIVER_INTENT
那么这几种返回值有什么作用呢?
通过阅读文档,我发现它们将影响服务异常终止
情况下重新启动服务时的行为,默认情况下,当我们的服务由于系统内存吃紧或者其它原因被异常终止时,系统会尝试在某个时刻又一次启动服务,这时,假设Service#onStartCommand
方法返回
- START_NOT_STICKY:
服务不会又一次创建,除非你再次调用startService
-
START_STICKY/START_STICKY_COMPATIBILITY:
服务又一次创建并启动。依次回调onCreate,onStartCommand,可是假设没有新的intent传给此service,onStartCommand
接受的将是一个空的intent
。
START_STICKY_COMPATIBILITY是START_STICKY的兼容版本号。2.0之下使用。它不保证一定调用onStartCommand
. -
START_REDELIVER_INTENT:
服务又一次创建并启动。依次回调onCreate,onStartCommand,而且会把最后一次传给此服务的intent
又一次发给onStartCommand
。
系统默认策略
Service的onStartCommand策略:
public int onStartCommand(Intent intent, int flags, int startId) {
onStart(intent, startId);
return mStartCompatibility ? START_STICKY_COMPATIBILITY : START_STICKY;
}
可见,默认的策略是START_STICKY,支持服务意外终止又一次创建的。
IntentService的实现策略: IntentService
不应该又一次实现onStartCommand
,而是去复写onHandleIntent
.
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
onStart(intent, startId);
return mRedelivery ?
START_REDELIVER_INTENT : START_NOT_STICKY;
}
public void setIntentRedelivery(boolean enabled) {
mRedelivery = enabled;
}
可见。IntentService
默认仅仅支持两种返回值START_REDELIVER_INTENT
或者START_NOT_STICKY
。而且由setIntentRedelivery
方法决定。默认是START_NOT_STICKY
,不又一次创建。
測试:
測试机:nexus5,android6.0
注:这里的kill service模拟的是服务意外被杀死的情形,这里我通过使用nexus的 close background apps
功能。即点击menu键,滑掉启动的app。
由于这样的做法是由系统杀死service,因而不会回调service
的生命周期方法onDestroy
-
onStartCommand返回Service.START_STICKY
- kill Service:
service会重新启动,并又一次运行
onCreate
和onStartCommand
方法,注意重新启动后运行onStartCommand
时的intent
參数将会是null
- stop Service:
仅运行
onDestroy
,不会重新启动服务 -
onStartCommand返回Service.START_NOT_STICKY
- kill Service:
service不会重新启动
- stop Service:
仅运行
onDestroy
。不会重新启动服务 -
onStartCommand返回Service.START_REDELIVER_INTENT
- kill Service:
service会重新启动,并又一次运行
onCreate
和onStartCommand
方法。注意重新启动后运行onStartCommand
时的intent
參数不为null
,也就是说会又一次发送之前的intent。- stop Service:
仅运行
onDestroy
。不会重新启动服务