Android应用开发中核心的四大组件是整体应用的骨架,利用好四大组件才能搭建出一个合理高效的APP。简单了解了Service之后,我们再来深入一下Service的生命周期与如何保活。
本文已收录至☞Android学习路线_梳理
上一篇☞Android学习路线_入门篇(四)四大组件之Service
下一篇☞Android学习路线_入门篇(六)四大组件之BroadcastReceiver
1. Service的生命周期
1.1 启动方式
上一篇文章已经仔细对Service的启动方式做了一个介绍,我们先来回顾一下。
Service的启动方式有两种:startService()
和bindService()
。
- 使用
startService()
方法启动Service,调用者与Service之间没有关系,即使调用者退出了,Service仍然运行。Service不会自动销毁,需要外部调用stopService()
方法或在Service内部调用stopSelf()
方法。 - 使用
bindService()
方法启动Service,调用者与Service绑定在了一起,调用者一旦销毁,Service也就终止了,调用者需要解绑时可调用unBindService()
方法。
1.2 生命周期
和启动方式一样,Service的生命周期也得分两种情况,根据Service的启动方式分为Unbounded
和Bounded
两种,如下图:
Unbounded
是Service被startService()
方法启动时经历的生命周期,Service不处于活动状态时,经历onCreate()
>onStartCommand()
流程进入活动状态,此时再次启动Service只调用onStartCommand()
方法。外部调用stopService()
方法或在Service内部调用stopSelf()
方法销毁Service,此时Service的onDestroy()
方法被调用。Bounded
是Service被bindService()
方法启动时经历的生命周期,Service不处于绑定状态时,经历onCreate()
>onBind()
流程进入绑定状态,此时再次绑定Service只调用onBind()
方法。外部调用unBindService()方法解绑Service或调用者被销毁时,Service经历onUnbind()
>onDestroy()
的过程。
2. Service保活
安卓系统有自动清理内存的机制,在一定情况下会自动杀死优先级较低的组件,如内存不足、电量过低、长时熄屏等等。其实Service保活只是提升Service存活的可能性,尽可能不给系统自动杀死Service的机制。
2.1 onStartCommand() 方法的返回值
相信有小伙伴在上一篇文章中已经看到了onStartCommand()
方法有一个返回值,我们目前是默认返回了父类的方法返回值super.onStartCommand(intent, flags, startId)
。
而这个方法可以有四种返回值,不同值代表的意思如下:
- START_STICKY:如果 service 进程被 kill 掉,保留 service 的状态为开始状态,但不保留递送的 intent 对象。随 后系统会尝试重新创建 service,由于服务状态为开始状态,所以创建服务后一定会调用
onStartCommand(Intent,int,int)
方法。如果在此期间没有任何启动命令被传递到 service,那么参数 Intent 将为 null。 - START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完
onStartCommand()
后,服务被异常 kill 掉,系统不会自动重启该服务。 - START_REDELIVER_INTENT:重传 Intent。使用这个返回值时,如果在执行完
onStartCommand()
后,服务被异 常 kill 掉,系统会自动重启该服务,并将 Intent 的值传入。 - START_STICKY_COMPATIBILITY:
START_STICKY
的兼容版本,但不保证服务被 kill 后一定能重启。
2.2 如何保证Service不被杀死?
- 在
AndroidManifest.xml
文件中对于intent-filter
可以通过android:priority = “1000”
这个属性设置最高优先级,1000是最高值,如果数字越小则优先级越低,同时实用于广播。 - 在
onStartCommand()
里面调用startForeground()
方法把Service提升为前台进程级别,然后再onDestroy里面要记得调用stopForeground()
方法。 - onStartCommand方法,手动返回
START_STICKY
。 - 在onDestroy方法里发广播重启service。
service +broadcast
方式,就是当service走onDestory的时候,发送一个自定义的广播,当收到广播的时候,重新启动service。(第三方应用或是在setting里-应用-强制停止时,APP进程就直接被干掉了,onDestroy方法都进不来,所以无法保证会执行)可以通过双Service互相唤起,提高成功率。 - 监听系统广播判断Service状态。通过系统的一些广播,比如:手机重启、界面唤醒、应用状态改变等等监听并捕获到,然后判断我们的Service是否还存活,若被杀死则重新启动Service。
- Application加上Persistent属性。
完毕
今天的分享就到这里,文章多有不足,各位小伙伴有什么想法可以直接评论或是私信,要是对你有所帮助就给我一个赞吧,喜欢我的小伙伴可以关注我哦~
本文已收录至☞Android学习路线_梳理
上一篇☞Android学习路线_入门篇(四)四大组件之Service
下一篇☞Android学习路线_入门篇(六)四大组件之BroadcastReceiver
支持我的小伙伴们可以微信搜索“Android思维库”,或者微信扫描下方二维码,关注我的公众号,每天都会推送新知识~