• 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

  • 相关阅读:
    [转] linux中 参数命令 -- 和
    ECharts 报表事件联动系列一:刷新页面
    Echarts 简单报表系列三:饼状图
    Echarts 简单报表系列二:折线图
    Echarts 简单报表系列一:柱状图
    Golang 在 Mac、Linux、Windows 下如何交叉编译(转)
    Spring Boot 打war包并利用docBase指定根目录为打包的工程
    JdbcTemplate查询返回JavaBean的几种方法
    Spring JdbcTemplate 查询结果集Map反向生成Java实体(转)
    Spring JdbcTemplate 查询出的Map,是如何产生大小写忽略的Key的?(转)
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7243625.html
Copyright © 2020-2023  润新知