当一个服务的onDestroy()方法没有被调用的情况是什么?

9
我知道Service的onDestroy()方法可能永远不会被调用,但有人能告诉我这种情况可能发生在什么时候吗?我特别想知道Service是否可能被杀死,但它的VM仍然会运行。
我之所以问这个问题是因为我有一个服务,在服务的onStartCommand()方法中注册ContentObservers并在onDestroy()中取消注册。如果整个VM被杀死(连同创建的观察者一起),服务的onDestroy()方法从未被调用,那也没关系。但我想知道是否可能出现服务“消失”的情况,而没有调用onDestroy(),而创建的观察者仍然存在并继续接收更改。

我知道一些低质量的任务管理器可以停止服务,但它可能无法调用 onDestroy() 方法。 - aacanakin
2个回答

11
我知道Service的onDestroy()方法可能永远不会被调用,但有人能告诉我这种情况可能发生在什么时候吗?
以下是我能想到的三种情况: - 如果用户从设置应用程序中强制停止您 - 如果Android需要紧急使用RAM(例如处理来电)并选择终止您的进程以释放该RAM - 您从DDMS终止了进程
此外,如果您的服务因未处理的异常而崩溃,Android可能认为该服务已死亡并跳过onDestroy()。 我不确定这一点,因为我没有专门尝试过。
除了我上面提到的未处理异常的可能性外,我相当确定在不调用onDestroy()的情况下,如果进程将在终止条件下终止,则观察者将继续接收更改。

因此,将Application类中的布尔成员安全地命名为isMyServiceRunning并将其默认设置为false,并在Service的onCreate()onDestroy()方法中进行更新是安全的。如果Service在没有调用onDestroy()的情况下被销毁,则包括Application类在内的所有进程都会被销毁,对吗? - Louis CAD
1
@LouisCAD:“如果服务在没有调用onDestroy()的情况下被销毁,那么整个进程,包括应用程序类都会被销毁,对吗?”-- 对于未处理的异常情况,情况并非一定如此。但对于我列出的情况,您是正确的。 - CommonsWare
在我的情況下,我有一個UncaughtException處理程序,該處理程序使用AlarmManager安排在幾秒鐘後重新啟動應用程序,然後殺死進程,使未處理的異常情況的行為類似於您列出的項目列表中的情況。 - Louis CAD

2

如果应用程序被重新安装/更新,ondestroy() 永远不会被调用。


感谢您在一年多后添加这些信息以完成! - René Schubert
但是你可以通过清单广播接收器监听ACTION_MY_PACKAGE_REPLACED,使应用程序意识到这一点,并在需要时恢复其状态。 - Louis CAD

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