在系统为内存而杀死它之后,由 BOOT_COMPLETE 启动的服务会发生什么?
它会在不重新启动手机的情况下重新启动吗?是否可以以某种方式重新启动它?
尽可能避免重要服务被杀死的最佳做法是什么?
在系统为内存而杀死它之后,由 BOOT_COMPLETE 启动的服务会发生什么?
它会在不重新启动手机的情况下重新启动吗?是否可以以某种方式重新启动它?
尽可能避免重要服务被杀死的最佳做法是什么?
如果您需要重新启动服务,那么您应该使用 AlarmManager 在单独的 BroadcastReceiver 中检查服务,但名义上当服务被系统杀死以获得内存时,它不会自动重新启动。
您可能想看看START_STICKY
它会在不重新启动手机的情况下重新启动吗?
可能。如果确实是因为“系统为内存而杀死它”,并且您从onStartCommand()
(例如,START_STICKY
)返回了一个适当的值,那么它应该在将来的某个时候重新启动。如果服务因用户操作而被终止(例如,设置中的管理服务屏幕中的强制停止),它将不会重新启动。
尽可能避免重要服务被杀死的最佳做法是什么?
首先,将您的应用程序设计为不依赖于这样的永久服务。99.44% 的 Android 应用程序不需要持续运行的服务,更不用说在启动时开始运行的服务了。Android 设备用户讨厌开发人员认为他们的应用程序非常重要,因为他们的服务一直在运行——这就是为什么我们有任务杀手、强制停止和 Android 因年老而终止服务的原因。例如,如果您每 15 分钟检查一次新电子邮件,请使用AlarmManager
和IntentService
,而不是永远运行的服务。
如果您可以向我和您的用户证明您的应用程序是真正需要在启动时启动并永久运行的服务的 0.56% 的应用程序之一,那么您可以使用startForeground()
. 这将向操作系统表明您的服务是前台用户体验的一部分。您将必须显示Notification
,理想情况下,如果用户不再认为这是合理的,则允许用户干净地关闭您的服务。
使用 AlarmManager 定期发送 Intent——接收 Intent 并确保您的服务正在运行。