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()
当服务不再使用且将被销毁时,系统将调用此方法。

服务应该实现此方法来清理全部资源,如线程、注冊的侦听器、接收器等。

这是服务接收的最后一个调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值