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
    Service#onStartCommand返回值解析_异常终止

    • stop Service:

    仅运行onDestroy,不会重新启动服务
    Service#onStartCommand返回值解析_启动服务_02

  2. onStartCommand返回Service.START_NOT_STICKY

    • kill Service:

    service不会重新启动
    Service#onStartCommand返回值解析_异常终止_03

    • stop Service:

    仅运行onDestroy。不会重新启动服务
    Service#onStartCommand返回值解析_整型_04

  3. onStartCommand返回Service.START_REDELIVER_INTENT

    • kill Service:

    service会重新启动,并又一次运行onCreateonStartCommand方法。注意重新启动后运行onStartCommand时的intent參数不为null,也就是说会又一次发送之前的intent。
    Service#onStartCommand返回值解析_整型_05

    • stop Service:

    仅运行onDestroy。不会重新启动服务
    Service#onStartCommand返回值解析_启动服务_06