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策略:


START_STICKY_COMPATIBILITY : START_STICKY;
}" data-snippet-id="ext.50780ac4cb7fc4d76c849927a398aa16" data-snippet-saved="false" data-csrftoken="NvwvVwLY-eM7tgvvRp01NOnxPvsU9xOY_4mM" data-codota-status="done">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.


START_REDELIVER_INTENT : START_NOT_STICKY;
} public void setIntentRedelivery(boolean enabled) {
mRedelivery = enabled;
}
" data-snippet-id="ext.daaf8f4b27f547456c7571d02e9b45b9" data-snippet-saved="false" data-csrftoken="ZyUc3hXg-9Es6MgkMSfhJ4Aiy8lFprmO20_Y" data-codota-status="done">@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返回值解析的更多相关文章

  1. SpringMVC源码学习:容器初始化+MVC初始化+请求分发处理+参数解析+返回值解析+视图解析

    目录 一.前言 二.初始化 1. 容器初始化 根容器查找的方法 容器创建的方法 加载配置文件信息 2. MVC的初始化 文件上传解析器 区域信息解析器 handler映射信息解析 3. Handler ...

  2. springMVC源码分析--HandlerMethodReturnValueHandlerComposite返回值解析器集合(二)

    在上一篇博客springMVC源码分析--HandlerMethodReturnValueHandler返回值解析器(一)我们介绍了返回值解析器HandlerMethodReturnValueHand ...

  3. 【移动开发】Service类onStartCommand()返回值和参数

    Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象的onStartCommand(Intent,int,int)方法,然后在onStart ...

  4. java.lang.String类compareTo()返回值解析

    一.compareTo()的返回值是int,它是先比较对应字符的大小(ASCII码顺序)1.如果字符串相等返回值02.如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值(ascii码值 ...

  5. springMVC源码分析--HandlerMethodReturnValueHandler返回值解析器(一)

    HandlerMethodReturnValueHandler是用于对Controller中函数执行的返回值进行处理操作的,springMVC提供了多个HandlerMethodReturnValue ...

  6. Service官方教程(2)*IntentService与Service示例、onStartCommand()3个返回值的含义。

    1.Creating a Started Service A started service is one that another component starts by calling start ...

  7. SpringMVC核心——返回值问题

    一.SpringMVC 使用 ModelAndView 来处理返回值问题. 1.ModelAndView 官方描述: Holder for both Model and View in the web ...

  8. springMVC源码分析--ViewNameMethodReturnValueHandler返回值处理器(三)

    之前两篇博客springMVC源码分析--HandlerMethodReturnValueHandler返回值解析器(一)和springMVC源码分析--HandlerMethodReturnValu ...

  9. Android中Service类onStartCommand的返回值问题

    Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象的onStartCommand(Intent,int,int)方法,然后在onStart ...

随机推荐

  1. CSU七月校赛A

    /*#include <iostream> #include<cstdio> #include<algorithm> #include<cstring> ...

  2. sqlplus terminators - Semicolumn (;), slash (/) and a blank line

    The problem here is the way SQL*Plus interprets the commands passed to it. Remember the "SQL co ...

  3. 【块状树】【树链剖分】【线段树】bzoj3531 [Sdoi2014]旅行

    离线后以宗教为第一关键字,操作时间为第二关键字排序. <法一>块状树,线下ac,线上tle…… #include<cstdio> #include<cmath> # ...

  4. 【贪心】bzoj3721 PA2014 Final Bazarek

    考虑不限制奇偶的情况,那就是直接排序取前k个的和. 加上奇偶限制:若排序后的前k个的和是偶数,则“显然地”:将其中的最小的奇数替换成未被选择的数中最大的偶数 或者 将其中的最小的偶数替换成未被选择的数 ...

  5. mac Nginx + FastCgi + Spawn-fcgi + c++

    1.安装要用到的库 brew install lighttpd brew install nginx brew install Spawn-fcgi //----------------------- ...

  6. BUG:Yii登录时 101 net::ERR_CONNECTION_RESET

    Bug描述:YII web入口登录,无法登录一直等待,最终重定向 原因:设置的默认路由DefauRoute中的控制器中有错误,导致无法跳转找指定的路由规则 解决方案:这就多亏了SourceTree了, ...

  7. Spring学习——DI(依赖注入)

    IOC容器,处理对象依赖关系 IOC与DI: IOC :是一个容器,创建对象的容器 DI :在容器创建对象后,处理对象的依赖关系,也叫依赖注入! 方式1:通过set方法注入值 可以给普通属性.集合属性 ...

  8. 用 HTML 元素实现自定义的滚动条

    有时,浏览器默认的滚动条不能满足需求,我们要实现自定义的滚动条.借助于鼠标移动事件和滚轮事件,以及内容元素的滚动相关属性,可以很容易地实现这样的需求.下面就来试一试. 我们这次要实现的滚动条需要有以下 ...

  9. 【js 正则表达式】记录所有在js中使用正则表达式的情况

    说实话,对正则表达式有些许的畏惧感,之前的每次只要碰到需要正则表达式去匹配的情况,都会刻意的躲过或者直接从度娘处获取. 此时此刻,感觉到了某一个特定的点去触及她.但笔者对于正则表达式使用上的理解是这样 ...

  10. Oracle中读取数据一些原理研究

    文章很多摘录了 http://blog.163.com/liaoxiangui@126/blog/static/7956964020131069843572/ 同时基于这篇文章的基础上,补充一些学习要 ...