Android学习路线_入门篇(五)Service的生命周期与如何保活

本文深入探讨Android Service的生命周期,包括启动方式、生命周期流程,并详细讲解如何通过onStartCommand()方法的返回值及设置Service优先级来实现Service保活。同时,介绍了在Service被杀死后如何通过各种策略重新启动Service。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android应用开发中核心的四大组件是整体应用的骨架,利用好四大组件才能搭建出一个合理高效的APP。简单了解了Service之后,我们再来深入一下Service的生命周期与如何保活。

本文已收录至☞Android学习路线_梳理
上一篇☞Android学习路线_入门篇(四)四大组件之Service
下一篇☞Android学习路线_入门篇(六)四大组件之BroadcastReceiver

1. Service的生命周期

1.1 启动方式

上一篇文章已经仔细对Service的启动方式做了一个介绍,我们先来回顾一下。

Service的启动方式有两种:startService()bindService()

  1. 使用startService()方法启动Service,调用者与Service之间没有关系,即使调用者退出了,Service仍然运行。Service不会自动销毁,需要外部调用stopService()方法或在Service内部调用stopSelf()方法。
  2. 使用bindService()方法启动Service,调用者与Service绑定在了一起,调用者一旦销毁,Service也就终止了,调用者需要解绑时可调用unBindService()方法。

1.2 生命周期

和启动方式一样,Service的生命周期也得分两种情况,根据Service的启动方式分为UnboundedBounded两种,如下图:
Service生命周期

  1. Unbounded是Service被startService()方法启动时经历的生命周期,Service不处于活动状态时,经历onCreate() > onStartCommand()流程进入活动状态,此时再次启动Service只调用onStartCommand()方法。外部调用stopService()方法或在Service内部调用stopSelf()方法销毁Service,此时Service的onDestroy()方法被调用。
  2. 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)

而这个方法可以有四种返回值,不同值代表的意思如下:

  1. START_STICKY:如果 service 进程被 kill 掉,保留 service 的状态为开始状态,但不保留递送的 intent 对象。随 后系统会尝试重新创建 service,由于服务状态为开始状态,所以创建服务后一定会调用 onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到 service,那么参数 Intent 将为 null。
  2. START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完 onStartCommand() 后,服务被异常 kill 掉,系统不会自动重启该服务。
  3. START_REDELIVER_INTENT:重传 Intent。使用这个返回值时,如果在执行完 onStartCommand() 后,服务被异 常 kill 掉,系统会自动重启该服务,并将 Intent 的值传入。
  4. START_STICKY_COMPATIBILITYSTART_STICKY 的兼容版本,但不保证服务被 kill 后一定能重启。

2.2 如何保证Service不被杀死?

  1. AndroidManifest.xml文件中对于intent-filter可以通过android:priority = “1000”这个属性设置最高优先级,1000是最高值,如果数字越小则优先级越低,同时实用于广播。
  2. onStartCommand()里面调用 startForeground()方法把Service提升为前台进程级别,然后再onDestroy里面要记得调用stopForeground()方法。
  3. onStartCommand方法,手动返回START_STICKY
  4. 在onDestroy方法里发广播重启service。service +broadcast 方式,就是当service走onDestory的时候,发送一个自定义的广播,当收到广播的时候,重新启动service。(第三方应用或是在setting里-应用-强制停止时,APP进程就直接被干掉了,onDestroy方法都进不来,所以无法保证会执行)可以通过双Service互相唤起,提高成功率。
  5. 监听系统广播判断Service状态。通过系统的一些广播,比如:手机重启、界面唤醒、应用状态改变等等监听并捕获到,然后判断我们的Service是否还存活,若被杀死则重新启动Service。
  6. Application加上Persistent属性。

完毕

今天的分享就到这里,文章多有不足,各位小伙伴有什么想法可以直接评论或是私信,要是对你有所帮助就给我一个赞吧,喜欢我的小伙伴可以关注我哦~

本文已收录至☞Android学习路线_梳理
上一篇☞Android学习路线_入门篇(四)四大组件之Service
下一篇☞Android学习路线_入门篇(六)四大组件之BroadcastReceiver

支持我的小伙伴们可以微信搜索“Android思维库”,或者微信扫描下方二维码,关注我的公众号,每天都会推送新知识~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值