Зачем переопределять Activity.onDestroy(), если он не вызывается надежно?

Я не понимаю, зачем кому-то переопределять Activity.onDestroy() вместо onPause(), если в соответствии с документация:

Бывают ситуации, когда система просто убьет хост-процесс активности, не вызывая в нем этот метод (или любой другой),

Я вижу много кода, который переопределяет onDestroy(), несмотря на это предупреждение. Почему?


person Jeff Axelrod    schedule 08.08.2012    source источник


Ответы (2)


Зачем переопределять Activity.onDestroy(), если он не вызывается надежно?

Дело не в том, что это называется надежно... просто это не единственный способ убить Activity. Система Android может испортить весь ваш процесс, не дав ActivityManager возможности вызвать onDestroy(), если вашему устройству начинает не хватать ресурсов памяти.

По этой причине вы никогда не должны полагаться на вызов onDestroy() и всегда должны сохранять постоянное состояние в onPause.

person Alex Lockwood    schedule 08.08.2012
comment
Верно, но в каких сценариях кто-то должен переопределить onDestroy(), а не всегда использовать onPause()? - person Jeff Axelrod; 08.08.2012
comment
@JeffAxelrod Причина, по которой люди предлагают сохранять состояние в onPause, заключается в том, что после вызова onPause Activity либо не имеет фокуса, либо не отображается на экране, что делает возможным, что система Android может убить Activity для экономии ресурсов памяти. В результате несохраненные изменения перестают быть безопасными после вызова onPause... отсюда общее предложение внести эти изменения в onPause до того, как Activity будет выведен из фокуса. - person Alex Lockwood; 08.08.2012
comment
@JeffAxelrod onDestroy больше предназначен для очистки ... например, если вы создали Thread в какой-то момент, вы должны убедиться, что убили их в onDestroy, чтобы Thread не остался запущенным после того, как Activity был уничтожен. (Примечание: вам не нужно беспокоиться об очистке после Thread в случае, если система убивает весь процесс, поскольку Thread живет в процессе.) - person Alex Lockwood; 08.08.2012
comment
@JeffAxelrod Короткий и приятный ответ: (1) сохранить изменения в информации, которую вы не хотите потерять после уничтожения Activity в onPause, и (2) убить ценные ресурсы, которые вы открыли в onDestroy, чтобы предотвратить утечку памяти. Не так уж часто вам действительно нужно переопределить onDestroy (по крайней мере, по моему опыту). - person Alex Lockwood; 08.08.2012

Объекты, удерживаемые активностью, будут уничтожены, если процесс будет уничтожен напрямую. Если процесс не убит (и вызывается onDestroy()), вам придется вручную освобождать объекты, если это необходимо. Например, когда процесс будет убит, курсор будет уничтожен, но если процесс не будет уничтожен, а вы повторно войдете в действие, произойдет утечка ресурсов.

person nandeesh    schedule 08.08.2012
comment
Прости, но я не слежу за тобой. Если вызывается onDestroy(), то по определению активность будет уничтожена. - person Jeff Axelrod; 08.08.2012
comment
деятельность будет уничтожена, но не процесс. Поэтому, если вы открыли курсор в действии, но не закрыли его, он будет протекать. Поэтому вам придется закрыть его, что вы можете сделать в ondestroy. Но этот случай не возникнет, если процесс будет убит - person nandeesh; 08.08.2012
comment
@JeffAxelrod, Activity живет в процессе, поэтому, когда процесс уничтожается ядром, все, что в нем содержится, уничтожается. - person Alex Lockwood; 08.08.2012