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方法返回
- START_NOT_STICKY:
服务不会又一次创建,除非你再次调用startService START_STICKY/START_STICKY_COMPATIBILITY:
服务又一次创建并启动。依次回调onCreate,onStartCommand,可是假设没有新的intent传给此service,onStartCommand接受的将是一个空的intent。START_STICKY_COMPATIBILITY是START_STICKY的兼容版本号。2.0之下使用。它不保证一定调用
onStartCommand.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
onStartCommand返回Service.START_STICKY
- kill Service:
service会重新启动,并又一次运行
onCreate和onStartCommand方法,注意重新启动后运行onStartCommand时的intent參数将会是null
- stop Service:
仅运行
onDestroy,不会重新启动服务
onStartCommand返回Service.START_NOT_STICKY
- kill Service:
service不会重新启动
- stop Service:
仅运行
onDestroy。不会重新启动服务
onStartCommand返回Service.START_REDELIVER_INTENT
- kill Service:
service会重新启动,并又一次运行
onCreate和onStartCommand方法。注意重新启动后运行onStartCommand时的intent參数不为null,也就是说会又一次发送之前的intent。
- stop Service:
仅运行
onDestroy。不会重新启动服务
Service#onStartCommand返回值解析的更多相关文章
- SpringMVC源码学习:容器初始化+MVC初始化+请求分发处理+参数解析+返回值解析+视图解析
目录 一.前言 二.初始化 1. 容器初始化 根容器查找的方法 容器创建的方法 加载配置文件信息 2. MVC的初始化 文件上传解析器 区域信息解析器 handler映射信息解析 3. Handler ...
- springMVC源码分析--HandlerMethodReturnValueHandlerComposite返回值解析器集合(二)
在上一篇博客springMVC源码分析--HandlerMethodReturnValueHandler返回值解析器(一)我们介绍了返回值解析器HandlerMethodReturnValueHand ...
- 【移动开发】Service类onStartCommand()返回值和参数
Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象的onStartCommand(Intent,int,int)方法,然后在onStart ...
- java.lang.String类compareTo()返回值解析
一.compareTo()的返回值是int,它是先比较对应字符的大小(ASCII码顺序)1.如果字符串相等返回值02.如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值(ascii码值 ...
- springMVC源码分析--HandlerMethodReturnValueHandler返回值解析器(一)
HandlerMethodReturnValueHandler是用于对Controller中函数执行的返回值进行处理操作的,springMVC提供了多个HandlerMethodReturnValue ...
- Service官方教程(2)*IntentService与Service示例、onStartCommand()3个返回值的含义。
1.Creating a Started Service A started service is one that another component starts by calling start ...
- SpringMVC核心——返回值问题
一.SpringMVC 使用 ModelAndView 来处理返回值问题. 1.ModelAndView 官方描述: Holder for both Model and View in the web ...
- springMVC源码分析--ViewNameMethodReturnValueHandler返回值处理器(三)
之前两篇博客springMVC源码分析--HandlerMethodReturnValueHandler返回值解析器(一)和springMVC源码分析--HandlerMethodReturnValu ...
- Android中Service类onStartCommand的返回值问题
Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象的onStartCommand(Intent,int,int)方法,然后在onStart ...
随机推荐
- Codeforces 189A. Cut Ribbon
题目链接:http://codeforces.com/problemset/problem/189/A 题意: 给你一个长度为 N 的布条, 再给你三个长度 a, b , c.你可以用剪刀去剪这些布条 ...
- ACM-ICPC 2018 沈阳赛区网络预赛 D. Made In Heaven(第k短路模板)
求第k短路模板 先逆向求每个点到终点的距离,再用dij算法,不会超时(虽然还没搞明白为啥... #include<iostream> #include<cstdio> #inc ...
- 洛谷——P1405 苦恼的小明
P1405 苦恼的小明 题目描述 黄小明和他的合伙人想要创办一所英语培训机构,注册的时候要填一张个人情况的表格,在身高一栏小明犯了愁. 身高要求精确到厘米,但小明实在太高了,无法在纸上填下这么长的数字 ...
- SPOJ BGSHOOT - Shoot and kill (线段树 区间修改 区间查询)
BGSHOOT - Shoot and kill no tags The problem is about Mr.BG who is a great hunter. Today he has gon ...
- Linux命令之umount
umount [-hV] umount -a [-dflnrv] [-t vfstype] [-O option] umount [-dflnrv] {dir|device} [-t vfstype] ...
- centos7下mail邮件的查看删除、禁止部分应用发邮件
查看与删除 mail命令进入 & p #显示当前邮件& 2 #显示标号为2的文件 & d 1-100 ...
- 服务认证暴力破解工具Crowbar
服务认证暴力破解工具Crowbar Crowbar是Kali Linux新增的一款服务认证暴力破解工具.该工具支持OpenVPN.RDP.SSH和VNC服务.该工具具备常见的暴力破解功能,如主机字 ...
- 【线段树】bzoj3922 Karin的弹幕
设置一个值K. d<=K:建立多组线段树:d>K:暴力. 最优时间复杂度的伪计算: O(n*K*logn(建树)+m*logn(询问类型1)+m*n/K(询问类型2)+m*K*logn(修 ...
- python3开发进阶-Django框架的起飞加速一(ORM)
阅读目录 ORM介绍 Django中的ORM ORM中的Model ORM的操作 一.ORM介绍 1.ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一 ...
- openresty的ngx.timer.at
openresty的ngx.timer.at真是个强大的方法. 例如某些函数不可以在一些NGINX的执行阶段使用时,可以ngx.timer.at API 创建一个零延迟的timer,在timer中去处 ...