【发布时间】:2012-08-08 05:32:03
【问题描述】:
我很困惑为什么有人会根据documentation 覆盖Activity.onDestroy() 而不是onPause():
在某些情况下,系统会简单地杀死活动的 托管进程而不在其中调用此方法(或任何其他方法),
尽管有这个警告,我还是看到了很多覆盖 onDestroy() 的代码。为什么?
【问题讨论】:
标签: android android-lifecycle onpause ondestroy
我很困惑为什么有人会根据documentation 覆盖Activity.onDestroy() 而不是onPause():
在某些情况下,系统会简单地杀死活动的 托管进程而不在其中调用此方法(或任何其他方法),
尽管有这个警告,我还是看到了很多覆盖 onDestroy() 的代码。为什么?
【问题讨论】:
标签: android android-lifecycle onpause ondestroy
如果没有可靠地调用 Activity.onDestroy(),为什么要覆盖它?
并不是说它不被可靠地 调用...只是它不是可以杀死Activity 的唯一方法。如果您的设备开始缺乏内存资源,Android 系统可能会破坏您的整个进程,而不会给ActivityManager 调用onDestroy() 的机会。
因此,您永远不应依赖 onDestroy() 被调用,而应始终将持久状态保存在 onPause 中。
【讨论】:
onDestroy(),而不是始终使用onPause()?
onPause 中保存状态的原因是因为在调用onPause 之后,Activity 要么没有焦点,要么没有显示在屏幕上,这使得它成为可能Android系统可以杀死Activity以节省内存资源。因此,在调用 onPause 之后,未保存的更改不再是“安全的”......因此,通常建议在 Activity 被取消关注之前在 onPause 中进行这些更改。
onDestroy 更多的是用于清理目的...例如,如果您在某个时候创建了Thread,则需要确保在onDestroy 中杀死它们这样Thread 就不会在Activity 被销毁后继续运行。 (注意:您不必担心在Thread 之后进行清理,以防系统杀死整个进程,因为Thread 存在于进程中。)
Activity 在onPause 中被破坏,以及(2)杀死有价值的资源您已在onDestroy 中打开以防止内存泄漏。您确实需要覆盖 onDestroy 的情况并不常见(至少根据我的经验)。
如果进程被直接杀死,活动持有的对象将被销毁。如果进程没有被杀死(并且onDestroy() 被调用),那么如果需要,您将不得不手动释放对象。例如,当进程被杀死时,一个Cursor会被销毁,但是如果进程没有被销毁,而你反复进入活动,则会出现资源泄漏。
【讨论】:
onDestroy()被调用,那么根据定义,这个activity将会被销毁。
Activity lives in the process,所以当进程被内核杀死时,进程中包含的所有内容都会被清除。