【问题标题】:Why override Activity.onDestroy() if it isn't reliably called?如果不能可靠地调用 Activity.onDestroy(),为什么要覆盖它?
【发布时间】:2012-08-08 05:32:03
【问题描述】:

我很困惑为什么有人会根据documentation 覆盖Activity.onDestroy() 而不是onPause()

在某些情况下,系统会简单地杀死活动的 托管进程而不在其中调用此方法(或任何其他方法),

尽管有这个警告,我还是看到了很多覆盖 onDestroy() 的代码。为什么?

【问题讨论】:

    标签: android android-lifecycle onpause ondestroy


    【解决方案1】:

    如果没有可靠地调用 Activity.onDestroy(),为什么要覆盖它?

    并不是说它不被可靠地 调用...只是它不是可以杀死Activity 的唯一方法。如果您的设备开始缺乏内存资源,Android 系统可能会破坏您的整个进程,而不会给ActivityManager 调用onDestroy() 的机会。

    因此,您永远不应依赖 onDestroy() 被调用,而应始终将持久状态保存在 onPause 中。

    【讨论】:

    • 对,但在哪些情况下需要有人覆盖onDestroy(),而不是始终使用onPause()
    • @JeffAxelrod 人们建议在onPause 中保存状态的原因是因为在调用onPause 之后,Activity 要么没有焦点,要么没有显示在屏幕上,这使得它成为可能Android系统可以杀死Activity以节省内存资源。因此,在调用 onPause 之后,未保存的更改不再是“安全的”......因此,通常建议在 Activity 被取消关注之前在 onPause 中进行这些更改。
    • @JeffAxelrod onDestroy 更多的是用于清理目的...例如,如果您在某个时候创建​​了Thread,则需要确保在onDestroy 中杀死它们这样Thread 就不会在Activity 被销毁后继续运行。 (注意:您不必担心在Thread 之后进行清理,以防系统杀死整个进程,因为Thread 存在于进程中。)
    • @JeffAxelrod 简短而甜蜜的答案是(1)保存对您不想丢失的信息的更改,一旦ActivityonPause 中被破坏,以及(2)杀死有价值的资源您已在onDestroy 中打开以防止内存泄漏。您确实需要覆盖 onDestroy 的情况并不常见(至少根据我的经验)。
    【解决方案2】:

    如果进程被直接杀死,活动持有的对象将被销毁。如果进程没有被杀死(并且onDestroy() 被调用),那么如果需要,您将不得不手动释放对象。例如,当进程被杀死时,一个Cursor会被销毁,但是如果进程没有被销毁,而你反复进入活动,则会出现资源泄漏。

    【讨论】:

    • 对不起,我没有关注你。如果onDestroy()被调用,那么根据定义,这个activity将会被销毁。
    • 活动将被销毁,但进程不会。因此,如果您在活动中打开了游标但没有关闭它,它将泄漏。所以你必须关闭它,你可以在 ondestroy 中做到这一点。但是如果进程被杀死,这种情况就不会出现
    • @JeffAxelrod Activity lives in the process,所以当进程被内核杀死时,进程中包含的所有内容都会被清除。
    猜你喜欢
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    相关资源
    最近更新 更多