Android: будет ли метод finish() ВСЕГДА вызывать onDestroy()?

Простой вопрос: можете ли вы быть уверены, что finish() позвонит onDestroy()? Я не нашел никаких подтверждений этому.


person Xander    schedule 10.11.2013    source источник
comment
stackoverflow.com/questions/10847526/   -  person BackSlash    schedule 10.11.2013
comment
не всегда, как указано в документации   -  person Blackbelt    schedule 10.11.2013
comment
@blackbelt, не могли бы вы сослаться на эту конкретную документацию?   -  person Xander    schedule 10.11.2013


Ответы (2)


Простой вопрос: можете ли вы быть уверены, что finish() вызовет onDestroy()?

Во-первых, этот ответ предполагает, что вы имеете в виду класс Android Activity и его метод finish() и метод жизненного цикла onDestroy().

Во-вторых, это зависит от вашего определения «конечно»:

  • Ваш процесс может быть остановлен между finish() и onDestroy() по причинам, не зависящим от того, что вызывает вызов finish().

  • Производитель устройства или моддер ПЗУ может внести какое-то странное изменение, которое разорвет связь между finish() и onDestroy().

  • Батарея может разрядиться между finish() и onDestroy().

  • И т.п.

В-третьих, finish() не звонит onDestroy(). Вы можете убедиться в этом, прочитав исходник код. finish() обычно вызывает вызов onDestroy().

Вообще говоря, finish() в конечном итоге приведет к вызову onDestroy().

person CommonsWare    schedule 10.11.2013
comment
Могу ли я полагаться на onDestroy() внутри процесса? Скажем, у меня есть действия A, B, C, D, E, и я хочу закончить все, кроме E, тогда будут ли вызываться все методы onDestroy()? Батарея и состояние памяти здесь не учитываются. - person Jenix; 02.07.2017
comment
@Jenix: Если процесс не завершен и вы не вызываете сбой (необработанное исключение), завершение действия приведет к вызову onDestroy() для этого действия. - person CommonsWare; 02.07.2017
comment
Слишком быстро хаха. Спасибо! - person Jenix; 02.07.2017
comment
Когда именно вызов finish() не вызовет вызов onDestroy (при условии, что onDestroy еще не был вызван и приложение все еще живо)? - person android developer; 03.11.2020
comment
@androiddeveloper: finish() не final, поэтому его можно переопределить, и реализация переопределения может в некоторых случаях по какой-то странной причине не связываться с суперклассом. И, по крайней мере, теоретически возможен сбой между finish() и onDestroy(), хотя я не знаю никаких сценариев для этого. - person CommonsWare; 03.11.2020
comment
@CommonsWare Сегодня я видел странный случай. Я переопределил onDestroy и finish и добавил журналы только для того, чтобы убедиться, что они действительно вызываются. Это действительно странно, но по какой-то причине я назвал finish, а не onDestroy. Вот почему я спрашиваю. Я впервые вижу такую ​​странную вещь. Тоже без понятия как исправить. И дело не в том, что у пользовательского интерфейса нет возможности что-либо сделать. Я видел, как finish вызывался несколько раз позже, и все же Activity не вызывал onDestroy ни разу. - person android developer; 04.11.2020
comment
@CommonsWare Неважно. Думаю, я понял. Я добрался до очень старого кода, который по какой-то причине синхронизировался в текущем действии через фоновый поток, а также вызывал setResult (который также синхронизируется в текущем действии) в потоке пользовательского интерфейса. Таким образом, это вызвало странные проблемы (вероятно, ANR или взаимоблокировка или что-то подобное). - person android developer; 04.11.2020

Нет, вы не можете быть уверены!

Вызов finish() обычно вызывает onDestroy() в соответствии с жизненным циклом Activity, но вы не можете полагаться на него. Специально не для сохранения ваших данных. В документации четко сказано

do not count on this method being called as a place for saving data! 
person Aniket Thakur    schedule 10.11.2013