为什么要重写 Activity.onDestroy() 方法,即使它不能可靠调用?

3
我不明白为什么有人会覆盖 Activity.onDestroy() 而非 onPause(),因为根据文档

有些情况下,系统会直接杀死 Activity 的宿主进程,而不调用此方法或其他任何方法。

尽管有这个警告,我看到很多代码仍覆盖了 onDestroy()。为什么?
2个回答

3
为什么要重写Activity.onDestroy()方法,即使它不能被可靠地调用?
并不是说它不能被可靠地调用,只是它不是Activity被关闭的唯一方式。如果您的设备开始缺乏内存资源,Android系统可能会在没有给ActivityManager调用onDestroy()的机会的情况下摧毁整个进程。
因此,您永远不应该依赖于onDestroy()被调用,并且您应该始终在onPause中保存持久状态。

但是,什么情况下需要覆盖onDestroy()而不是始终使用onPause() - Jeff Axelrod
2
@JeffAxelrod 人们建议在onPause中保存状态的原因是,在调用onPause之后,Activity要么没有焦点,要么不显示在屏幕上,这使得Android系统有可能杀死Activity以节省内存资源。因此,在调用onPause之后,未保存的更改不再是“安全的”...因此,常见的建议是在Activity失去焦点之前在onPause中进行这些更改。 - Alex Lockwood
1
@JeffAxelrod onDestroy 更多是用于清理目的...例如,如果您曾经创建了一个 Thread,您会希望确保在 onDestroy 中杀死它们,以便一旦 Activity 被销毁,Thread 不会继续运行。(注意: 如果系统杀死整个进程,则无需担心在 Thread 后进行清理,因为 Thread 存在于进程中。) - Alex Lockwood
2
@JeffAxelrod 简短而简洁的答案是:(1)在 onPause 中保存您不想丢失的信息更改,一旦 Activity 被销毁,以及(2)在 onDestroy 中关闭您已打开的有价值的资源,以防止内存泄漏。在我的经验中,你真正需要重写 onDestroy 的情况并不太多。 - Alex Lockwood

0

如果进程直接被杀死,Activity持有的对象将会被销毁。如果进程没有被杀死(onDestroy()方法被调用),则你需要手动释放这些对象。例如,当进程被杀死时,Cursor将被销毁,但是如果进程没有被销毁而你反复进入Activity,那么就会出现资源泄漏。


抱歉,我不太明白您的意思。如果调用了 onDestroy() 方法,则根据定义,该活动将被销毁。 - Jeff Axelrod
1
活动将被销毁,但进程不会。因此,如果您在活动中打开了光标但没有关闭它,它将泄漏。因此,您必须关闭它,在ondestroy中可以这样做。但是,如果进程被杀死,就不会出现这种情况。 - nandeesh
@JeffAxelrod Activity 生存在进程中,因此当进程被内核杀死时,进程中包含的所有内容都会被清除。 - Alex Lockwood

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