Service具体解释(二):Service生命周期
《 Service具体解释(一):什么是Service》
《 Service具体解释(二):Service生命周期》
《Service具体解释(三):Service的使用》
《Service具体解释(四):绑定服务 与 通信》
《Service具体解释(五):使用Messager进行通信》
《Service具体解释(六):进程间通信-AIDL》
与Activity相似,Service也有自己的生命周期函数,在不同的时刻。系统会调用相应的Service生命周期函数,只是与Activity声明周期相比,Service的声明周期更加简单。我们通过官方给出的一张图片来体会一下:
这里我们总结一下:
1). 被启动的服务的生命周期:假设一个Service被某个Activity 调用 Context.startService 方法启动。那么无论是否有Activity使用bindService绑定或unbindService解除绑定到该Service。该Service都在后台执行。假设一个Service被startService 方法多次启动,那么onCreate方法仅仅会调用一次,onStart将会被调用多次(相应调用startService的次数),而且系统仅仅会创建Service的一个实例(因此你应该知道仅仅须要一次stopService调用)。该Service将会一直在后台执行。而无论相应程序的Activity是否在执行,直到被调用stopService,或自身的stopSelf方法。
当然假设系统资源不足,android系统也可能结束服务。
2). 被绑定的服务的生命周期:假设一个Service被某个Activity 调用 Context.bindService 方法绑定启动,无论调用 bindService 调用几次,onCreate方法都仅仅会调用一次。同一时候onStart方法始终不会被调用。当连接建立之后,Service将会一直执行,除非调用Context.unbindService 断开连接或者之前调用bindService 的 Context 不存在了(如Activity被finish的时候)。系统将会自己主动停止Service,相应onDestroy将被调用。
3). 被启动又被绑定的服务的生命周期:假设一个Service又被启动又被绑定。则该Service将会一直在后台执行。而且无论怎样调用。onCreate始终仅仅会调用一次,相应startService调用多少次。Service的onStart便会调用多少次。调用unbindService将不会停止Service。而必须调用 stopService 或 Service的 stopSelf 来停止服务。
4). 当服务被停止时清除服务:当一个Service被终止(1、调用stopService;2、调用stopSelf;3、不再有绑定的连接(没有被启动))时。onDestroy方法将会被调用,在这里你应当做一些清除工作。如停止在Service中创建并执行的线程。
特别注意:
1、你应当知道在调用 bindService 绑定到Service的时候,你就应当保证在某处调用 unbindService 解除绑定(虽然 Activity 被 finish 的时候绑定会自 动解除。而且Service会自己主动停止);
2、你应当注意 使用 startService 启动服务之后。一定要使用 stopService停止服务。无论你是否使用bindService。
3、同一时候使用 startService 与 bindService 要注意到。Service 的终止,须要unbindService与stopService同一时候调用,才干终止 Service。无论 startService 与 bindService 的调用顺序,假设先调用 unbindService 此时服务不会自己主动终止,再调用 stopService 之后服务才会停止。假设先调用 stopService 此时服务也不会终止,而再调用 unbindService 或者 之前调用 bindService 的 Context 不存在了(如Activity 被 finish 的时候)之后服务才会自己主动停止。
4、当在旋转手机屏幕的时候,当手机屏幕在“横”“竖”变换时。此时假设你的 Activity 假设会自己主动旋转的话,旋转事实上是 Activity 的又一次创建。因此旋转之前的使用 bindService 建立的连接便会断开(Context 不存在了),相应服务的生命周期与上述同样。
5、在 sdk 2.0 及其以后的版本号中,相应的 onStart 已经被否决变为了 onStartCommand,只是之前的 onStart 任然有效。
这意味着,假设你开发的应用程序用的 sdk 为 2.0 及其以后的版本号,那么你应当使用 onStartCommand 而不是 onStart。
生命周期方法说明
onStartCommand()
当还有一个组件(如 Activity)通过调用 startService() 请求启动服务时,系统将调用此方法。一旦执行此方法。服务即会启动并可在后台无限期执行。 假设您实现此方法,则在服务工作完毕后。须要由您通过调用 stopSelf() 或 stopService() 来停止服务。(假设您仅仅想提供绑定,则无需实现此方法。)
onBind()
当还有一个组件想通过调用 bindService() 与服务绑定(比如执行 RPC)时,系统将调用此方法。在此方法的实现中,您必须通过返回 IBinder 提供一个接口,供client用来与服务进行通信。请务必实现此方法,但假设您并不希望同意绑定,则应返回 null。
onCreate()
首次创建服务时。系统将调用此方法来执行一次性设置程序(在调用 onStartCommand() 或 onBind() 之前)。假设服务已在执行,则不会调用此方法。
onDestroy()
当服务不再使用且将被销毁时,系统将调用此方法。
服务应该实现此方法来清理全部资源,如线程、注冊的侦听器、接收器等。
这是服务接收的最后一个调用。
Service具体解释(二):Service生命周期的更多相关文章
- 如何解释vue的生命周期才能令面试官满意?
当面试官问:"谈谈你对vue的生命周期的理解",听到这句话你是不是心里暗自窃喜:这也太容易了吧,不就是beforeCreate.created.beforeMount.mounte ...
- MVVM框架(二)---生命周期
一.Vue 生命周期图解: 这张图是官方给出的,大家可能都看过.其中我们重点讲述以下几个钩子函数: beforeCreate --> created beforeMount --> ...
- Android(java)学习笔记227:服务(service)之服务的生命周期 与 两种启动服务的区别
1.之前我们在Android(java)学习笔记171:Service生命周期 (2015-08-18 10:56)说明过,可以回头看看: 2.Service 的两种启动方法和区别: (1)Servi ...
- Android -- Service的开启关闭与生命周期
Service是Android 系统中的四大组件之一,是在一段不定的时间运行在后台,不和用户交互应用组件. service可以在很多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity ...
- Android(java)学习笔记170:服务(service)之服务的生命周期 与 两种启动服务的区别
1.之前我们在Android(java)学习笔记171:Service生命周期 (2015-08-18 10:56)说明过,可以回头看看: 2.Service 的两种启动方法和区别: (1)Servi ...
- Servlet的创建二以及生命周期
之前说Servlet可以通过实现Servlet接口来创建,但是我们看到了,需要重写该接口中的所有方法. 创建方式二:Servlet的创建还可以继承抽象类GenericServlet并重写其中的抽象方法 ...
- (十二)Maven生命周期和插件
除了坐标.依赖以及仓库之外,Maven的另外两个核心概念是生命周期和插件.在有关Maven的日常使用中,命令行的输入往往就对应了生命周期,如mvn package就表示执行默认生命周期阶段packag ...
- .net学习笔记---Asp.net的生命周期之二页生命周期
用户请求 从 用户角度来说,我不管你后台经历了什么,我只想要我请求的页面.请求到服务器端,服务器必须得有所表示的是吧,即使不想搭理人家也得让IIS给人家说声:找不到服务器.请求来到服务器端,肯定要让服 ...
- Activity学习(二)——生命周期
一.什么是Activity? 简单的说:Activity就是布满整个窗口或者悬浮于其他窗口上的交互界面.在一个应用程序中通常由多个Activity构成,都会在Manifest.xml中指定一个主的Ac ...
- 小白学phoneGap《构建跨平台APP:phoneGap移动应用实战》连载二(生命周期)
4.1 什么是生命周期 想要真正地理解PhoneGap应用开发的内涵,首先需要理解什么是生命周期.这在字面上其实非常容易理解,一个应用从开始运行被手机加载到应用被退出之间的过程就称之为一个生命周期.为 ...
随机推荐
- 属性通知之ObservableCollection
单个属性是如何去通知,在上一章已经介绍过了,那么集合如何做到属性通知呢?这里要介绍ObservableCollection<T>,字面意思就是用于观察的集合. msdn上给出的定义是:表示 ...
- CF1060C Maximum Subrectangle【乘法分配律】【最大子矩阵】
CF1060C Maximum Subrectangle 题意翻译 现在给出一个长度为N的a数列,一个长度为M的b数列. 现在需要构造出一个矩阵c,其中ci,j=ai×bj.再给出一个x,请在矩 ...
- 读书笔记_Effective_C++_条款三十二:确定你的public继承继承塑模出is-a关系
这一条款是说的是公有继承的逻辑,如果使用继承,而且继承是公有继承的话,一定要确保子类是一种父类(is-a关系).这种逻辑可能与生活中的常理不相符,比如企鹅是生蛋的,所有企鹅是鸟类的一种,直观来看,我们 ...
- C++各大名库
C++各大名库的介绍之C++标准库 标准库中提供了C++程序的基本设施.虽然C++标准库随着C++标准折腾了许多年,直到标准的出台才正式定型,但是在标准库的实现上却很令人欣慰得看到多种实现,并且已被实 ...
- 如何在java中跳出当前多重嵌套循环?有几种方法?
如何在java中跳出当前多重嵌套循环?有几种方法? - 两种方法 - 1.在外层循环定义标记 ok: for(int i=0;i<100;i++){ ...
- spring---transaction(2)---源代码分析(事务的定义TransactionDefinition)
写在前面 事务属性通过TransactionDefinition接口实现定义,主要有事务隔离级别.事务传播行为.事务超时时间.事务是否只读. public interface TransactionD ...
- MySQL Innodb 存储引擎学习篇
master thread的县城优先级别最高.其内部由几个循环(loop)组成:主循环(loop).后台循环(background loop).刷新循环(flush loop).暂停循环(suspen ...
- 该死的Ubuntu 16.04不自动续租DHCP的IP
BUG,这是一个BUG,参考:https://bugs.launchpad.net/ubuntu/+source/isc-dhcp/+bug/1551351,如果不自动续租IP,导致的问题就是网线灯还 ...
- MVC使用Entity Framework Code First,用漂亮表格显示1对多关系
部门和职员是1对多关系.用一个表格列出所有部门,并且在每行显示该部门下的所有职员名称.如下: 部门和职员的Model: using System.Collections.Generic; namesp ...
- 7. python 字符串格式化方法(2)
7. python 字符串格式化方法(2) 紧接着上一章节,这一章节我们聊聊怎样添加具体格式化 就是指定替换字段的大小.对齐方式和特定的类型编码,结构如下: {fieldname!conversion ...