标签:
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
方法返回
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
service会重启,并重新执行onCreate
和onStartCommand
方法,注意重启后执行onStartCommand
时的intent
参数将会是null
仅执行onDestroy
,不会重启服务
onStartCommand返回Service.START_NOT_STICKY
service不会重启
仅执行onDestroy
,不会重启服务
onStartCommand返回Service.START_REDELIVER_INTENT
service会重启,并重新执行onCreate
和onStartCommand
方法,注意重启后执行onStartCommand
时的intent
参数不为null
,也就是说会重新发送之前的intent。
仅执行onDestroy
,不会重启服务
标签:
原文地址:http://blog.csdn.net/chdjj/article/details/50428986