码迷,mamicode.com
首页 > 其他好文 > 详细

Service#onStartCommand返回值解析

时间:2017-07-27 11:35:33      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:tin   rri   info   markdown   rip   注意   依次   通过   情况   

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
    技术分享

    • stop Service:

    仅运行onDestroy,不会重新启动服务
    技术分享

  2. onStartCommand返回Service.START_NOT_STICKY

    • kill Service:

    service不会重新启动
    技术分享

    • stop Service:

    仅运行onDestroy。不会重新启动服务
    技术分享

  3. onStartCommand返回Service.START_REDELIVER_INTENT

    • kill Service:

    service会重新启动,并又一次运行onCreateonStartCommand方法。注意重新启动后运行onStartCommand时的intent參数不为null,也就是说会又一次发送之前的intent。
    技术分享

    • stop Service:

    仅运行onDestroy。不会重新启动服务
    技术分享

Service#onStartCommand返回值解析

标签:tin   rri   info   markdown   rip   注意   依次   通过   情况   

原文地址:http://www.cnblogs.com/claireyuancy/p/7243625.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!