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 ...
随机推荐
- flutter 布局
一.Container 一个空白容器 二.Row 行 mainAxisAlignment 主轴对齐 , CrossAxisAlignment 垂直于主轴对齐 三.Column 列 四.ListVie ...
- Android学习--广播机制
广播机制简介 Android的广播可以分为两种类型的,标准广播和有序的广播: 标准广播: 是一种完全异步执行的广播,在广播发出去之后,所有的广播接收器几乎是同一时接收到这条广播. 有序广播: 是一 ...
- python3爬虫爬取猫眼电影TOP100(含详细爬取思路)
待爬取的网页地址为https://maoyan.com/board/4,本次以requests.BeautifulSoup css selector为路线进行爬取,最终目的是把影片排名.图片.名称.演 ...
- Codeforces #449 Div2 D
#449 Div2 D 题意 交互式类题目. 起始有 n 张纸,会给出 m 次数字 p (\(1 \leq p \leq c\)),每次可选择一张纸,并在纸上写上这个数字,如果纸上已经存在数字,会覆盖 ...
- Linux命令之umount
umount [-hV] umount -a [-dflnrv] [-t vfstype] [-O option] umount [-dflnrv] {dir|device} [-t vfstype] ...
- java.sql.SQLException: Access denied for user ''@'localhost' (using password: No)
出错原因: 连接数据库是忘记配username 和 password 了 刚在学hiberbate4,把持久层从纯粹的jdbc改为hiberbate 出现的错误.(原来的是直接读取properties ...
- 获取OS X中App Store更新后的安装包(如XCode)
如果宿舍有好几个人需要更新一些大的软件,如XCode,会占用很大的带宽. 为了节省带宽,我们可以在1台电脑上更新完后,获取存放在系统暂存区的更新的安装包,然后通过局域网或Airdrop的方式轻松分 ...
- 移除tabBar 重影
-(void)viewWillLayoutSubviews{ [super viewWillLayoutSubviews]; for (UIView *child in self.tabBar.sub ...
- redis系列文章
http://blog.csdn.net/liubenlong007/article/details/53690103
- EF需要注意的virtual,懒加载,还有1对n更新
1.如果实体类型有任何一个集合属性是 virtual 的,那么该属性会懒加载,在查询该对象时,看到的类型是代理对象(proxy_xxxx), 使用new来更新1对n关系时会 增加 ).FirstOrD ...