Service#onStartCommand返回值解析

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方法返回

  1. START_NOT_STICKY:
    服务不会重新创建,除非你再次调用startService
  2. START_STICKY/START_STICKY_COMPATIBILITY:
    服务重新创建并启动,依次回调onCreate,onStartCommand,但是如果没有新的intent传给此service,onStartCommand接受的将是一个空的intent
    START_STICKY_COMPATIBILITY是START_STICKY的兼容版本,2.0之下使用,它不保证一定调用onStartCommand.

  3. 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

  1. onStartCommand返回Service.START_STICKY

    • kill Service:

    service会重启,并重新执行onCreateonStartCommand方法,注意重启后执行onStartCommand时的intent参数将会是null
    01

    • stop Service:

    仅执行onDestroy,不会重启服务
    02

  2. onStartCommand返回Service.START_NOT_STICKY

    • kill Service:

    service不会重启
    01

    • stop Service:

    仅执行onDestroy,不会重启服务
    02

  3. onStartCommand返回Service.START_REDELIVER_INTENT

    • kill Service:

    service会重启,并重新执行onCreateonStartCommand方法,注意重启后执行onStartCommand时的intent参数不为null,也就是说会重新发送之前的intent。
    01

    • stop Service:

    仅执行onDestroy,不会重启服务
    02

你可能感兴趣的:(android)