Activity 和 JobIntentService 生命周期

Posted

技术标签:

【中文标题】Activity 和 JobIntentService 生命周期【英文标题】:Activity and JobIntentService Lifecycle 【发布时间】:2019-01-05 10:19:31 【问题描述】:

我正在运行JobIntentService 在后台执行任务。使用JobIntentService 的原因是,用户可以在操作发生时最小化屏幕,即使 android 操作系统破坏了活动,JobIntentService 仍将继续运行,如果用户回来,他可以更新结果。

但我有一种情况,假设用户自己关闭了应用程序,那么我也想停止JobIntentService

当用户自己关闭应用时,有什么方法可以通知JobIntentService

任何帮助将不胜感激。

编辑:我尝试使用 onTaskRemoved 是没有用的,因为我的测试设备没有调用它(我相信许多其他设备也不会调用它)。此外,当应用程序从最近列表中删除时服务会自动停止,但当应用程序再次打开时会再次重新启动,这是我不想要的。

【问题讨论】:

How to cancel a JobIntentService的可能重复 “用户关闭应用”是什么意思?用户如何“关闭应用”? @DavidWasser 从最近的列表中删除它? 【参考方案1】:

当用户从最近的任务列表中滑动任务时,Service 被杀死的原因是,当用户从最近的任务列表中滑动任务时,Android 只会杀死托管应用程序的操作系统进程。然后,Android 将重新启动在它刚刚杀死的操作系统进程中运行的任何 Service

这种行为随着时间的推移而变化,并且在不同版本的 Android 上有所不同,而且一些制造商有自己的自定义 ROM,他们以不同的方式实现这一点。

您无法确保您的Service 不会被Android 杀死并重新启动。你可以试试这个,这可能会有所帮助:

将您的Service 放在单独的操作系统进程中。为此,请将 android:process=":remote" 添加到清单中的 <service> 标记中。在某些版本的 Android 上,从最近的任务列表中滑动任务只会杀死托管活动的操作系统进程。在这种情况下,这可能会阻止 Android 杀死您的 Service

您还说onTaskRemoved() 未被调用,并且您的Service 在Android 杀死它后不会自动重新启动。这发生在制造商试图积极节省电池电量的某些设备上。这在中国设备(小米、中兴等)上很常见,一些 LG、华为和联想设备也表现出这种行为。在这些设备上,有一个允许在后台运行的应用程序列表(也称为“受保护”应用程序)。您必须在这些设备上手动将您的应用添加到此列表中(或告诉您的用户他们需要手动将您的应用添加到列表中)。如果您的应用程序在“受保护的应用程序”或“允许在后台运行的应用程序”列表中,那么如果用户从最近任务列表中滑动该任务,或者如果它确实如此,Android 现在可能会终止您的Service杀死它,它应该调用onTaskRemoved(),它也应该立即自动重启Service

【讨论】:

非常感谢您的回答。但是,当用户从最近的列表中滑动应用程序时,有什么方法可以确保 JobIntentService 被 100% 杀死?由于我想在从最近列表中滑动应用程序时停止长时间运行的操作。 当然。只需在清单中设置android:stopWithTask="true"。那么当用户从最近的任务列表中滑动任务时,Android 将始终杀死Service 感谢您的回答。已接受,但它说不能在 4 小时之前奖励赏金。但肯定会在 4 小时后完成。谢谢

以上是关于Activity 和 JobIntentService 生命周期的主要内容,如果未能解决你的问题,请参考以下文章

Android——Activity和Intent及Activity的生命周期

Activity 的介绍和使用

appcompatactivity和activity的区别

Activity的launchMode和任务栈小结

转载Android开发中巧用Activity和Fragment

关于fragment和activity