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. 洛谷 P1182 数列分段`Section II`【二分答案】

    [代码]: #include<bits/stdc++.h> const double eps = 1e-8; const int maxn = 1e6+5; #define inf 0x3 ...

  2. 【分类讨论】bzoj3856 Monster

    #include<cstdio> using namespace std; int T=0; long long h,a,b,k; int main() { freopen("b ...

  3. 【状态压缩DP】BZOJ1087-[SCOI2005]互不侵犯King

    [题目大意] 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. [思路] 先预处理每一行可行的状态 ...

  4. (转)unity web 缓存解决方案

    unity web 缓存解决方案 官方发布 web版限制五十M缓存,根据自己的经验绕了过去,解决了缓存的问题.带工程,带源代码.由于本人的水平也有限,是用JS来解决的,如果你还是没有头绪,可以购买来试 ...

  5. jquery区分苹果浏览器和安卓浏览器

    var browser={ versions:function(){ var u = navigator.userAgent, app = navigator.appVersion; return { ...

  6. [HTML/CSS]uploadify自定义按钮样式

    概述 在项目中经常用到uploadify上传插件,但是FLASH按钮的外观往往跟我们网页的设计的主题色不太搭配.这时就需要对其样式进行修改. 样式文件是uploadify.css. 打开这个文件后,你 ...

  7. Java 图片添加水印效果

    package com.xiaowu.drawwater.demo; import java.awt.AlphaComposite; import java.awt.Graphics2D; impor ...

  8. oracle 10g函数大全--其他函数

    DUMP(w[,x[,y[,z]]]) [功能]返回数据类型.字节长度和在内部的存储位置. [参数] w为各种类型的字符串(如字符型.数值型.日期型……) x为返回位置用什么方式表达,可为:8,10, ...

  9. Swing:LookAndFeel 教程第一篇——手把手教你写出自己的 LookAndFeel

    本文是 LookAndFeel 系列教程的第一篇. 是我在对 Swing 学习摸索中的一些微薄经验. 我相信,细致看全然系列之后.你就能写出自己的 LookAndFeel. 你会发现 Swing 原来 ...

  10. vim使用指北 ---- Multiple Windows in Vim

    多窗口打开多个文件 vim -o file1 file2 ... ---- 默认上下分割窗口 vim -0n file1 file2 ... ---- vim默认会上下等分n个窗口 分割窗口 :[v] ...