活动和JobIntentService生命周期

4
我在后台运行一个JobIntentService来执行任务。使用JobIntentService的原因是,用户可以最小化屏幕,即使Android OS销毁活动,JobIntentService仍将继续运行,而且如果用户回来,他可以得到更新的结果。
但我有一种情况,假设用户自己关闭了应用程序,那么我也想停止JobIntentService
是否有任何方法可以在用户自己关闭应用程序时通知JobIntentService
真的需要帮助。
编辑:我尝试使用onTaskRemoved,但我的测试设备没有调用它(我确定许多其他设备也不会调用它)。此外,服务在从最近的列表中删除应用程序时会自动停止,但在再次打开应用程序时会重新启动,这正是我不想要的。

可能是如何取消JobIntentService的重复问题。 - HeyAlex
“用户关闭应用”是什么意思?用户如何“关闭应用”? - David Wasser
@DavidWasser 从最近列表中删除它? - Rajesh K
1个回答

7
当用户从最近任务列表中滑动任务时,导致你的Service被杀死的原因是Android会杀死托管应用程序的操作系统进程。然后,Android将重新启动任何在刚刚被杀死的操作系统进程中运行的Service
这种行为随着时间的推移而改变,并且在不同版本的Android上有所不同,一些制造商也有自己的定制ROM,在其中以不同的方式实现此功能。
没有办法确保你的Service不会被Android杀死并重新启动。你可以尝试以下方法,这可能会有所帮助:
将你的Service放在一个单独的操作系统进程中。为此,请将android:process=":remote"添加到清单文件中的<service>标签中。在某些Android版本上,从最近任务列表中滑动任务只会杀死托管活动的操作系统进程。这可能会防止Android在这种情况下杀死你的Service
你还说onTaskRemoved()没有被调用,而且Android在杀死它之后没有自动重启你的Service。这种情况发生在一些制造商试图积极节省电池电量的设备上。这在中国品牌(小米,中兴等)和一些LG、华为和联想设备上很常见。在这些设备上,有一个允许在后台运行的应用程序列表(也称为“受保护”的应用程序)。你必须在这些设备上手动将你的应用程序添加到此列表中(或告诉用户他们需要手动将你的应用程序添加到列表中)。如果你的应用程序在“受保护的应用程序”或“允许在后台运行的应用程序”列表中,则Android可能不会杀死你的Service,如果用户从最近任务列表中滑动任务,或者如果它确实杀死了它,它应该立即调用onTaskRemoved()并自动重新启动Service

非常感谢您的回答。但是有没有办法确保JobIntentService在用户从最近列表中滑动应用程序时完全被终止?因为我想在应用程序从最近列表中滑动时停止长时间运行的操作。 - Rajesh K
2
当然可以。只需要在清单文件中设置 android:stopWithTask="true" 即可。这样,当用户从最近任务列表中滑动任务时,Android 就会始终杀死该 Service - David Wasser
1
感谢您的回答。我已经接受了,但是它说在4小时之前无法颁发悬赏。但是我一定会在4小时后颁发悬赏。谢谢。 - Rajesh K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接