Вызывается ли onDestroy только в том случае, если вы явно вызываете finish() ?? или есть исключения?

У меня есть LocalBroadcastReceiver, и я unregistering в моем ondestroy().

Теперь я прочитал о ondestroy(), упомянутом в этих двух ответах SO a> и почему-implement-ondestroy-if -это-не-гарантировано-будет-вызвано, а также в Документы Android, которые

onDestroy будет вызываться, если вы явно вызываете finish();

Но почему в моем случае я не звоню finish(), но все равно ondestroy() вызывается каждый раз на всех моих устройствах Android. Также, по вашим словам, ребята, где бывают случаи, когда ondestroy() не вызывают.

Кроме того, даже если Android убьет мое приложение (из-за меньшего объема памяти), мне не о чем беспокоиться, так как Android убьет все мое приложение, поэтому получатель в конечном итоге будет убит (так что не будет никакой утечки памяти). ).

Итак, для моего варианта использования, в каких случаях ondestroy() не будет вызываться.


person Sudhanshu Gaur    schedule 24.08.2017    source источник


Ответы (1)


Но почему в моем случае я не вызываю finish(), но все же ondestroy() вызывается каждый раз на всех устройствах Android.

Реализация по умолчанию onBackPressed() того, что запускается кнопкой НАЗАД, вызывает finish().

где случаи, когда ondestroy() не вызывается.

  1. Если вы вылетаете из-за необработанного исключения

  2. Если ваш процесс прерывается в срочном порядке (например, системе требуется оперативная память для обработки входящего телефонного звонка)

  3. Если пользователь нажимает «Принудительно остановить» на экране вашего приложения в настройках

  4. На некоторых устройствах, если пользователь завершает ваш процесс с помощью диспетчера задач, предоставленного производителем

Кроме того, даже если Android убьет мое приложение (из-за меньшего объема памяти), мне не о чем беспокоиться, так как Android убьет все мое приложение, поэтому получатель в конечном итоге будет убит.

Да, потому что весь ваш процесс будет прекращен.

person CommonsWare    schedule 24.08.2017
comment
В первом случае, если мое приложение выйдет из строя, я не думаю, что мне нужно отменить регистрацию моего приемника, потому что, поскольку приложение уже закрыто, и когда пользователь снова коснется его, память снова будет выделена моему приложению. - person Sudhanshu Gaur; 24.08.2017
comment
Во втором случае это то же самое, что и в случае с меньшим объемом памяти, о котором я упоминал, или нет? - person Sudhanshu Gaur; 24.08.2017
comment
@SudhanshuGaur: В первом случае ... - это во многом зависит от того, как ваше приложение обрабатывает необработанные исключения. Во втором случае... -- да, это часть сценария, о котором вы упомянули, что Android завершает ваш процесс из-за нехватки памяти. Иногда Android требует времени, чтобы вызвать onDestroy() о ваших занятиях бегом. Иногда этого не происходит, так как это не может занять время. - person CommonsWare; 24.08.2017
comment
Других дел осталось или нет?? потому что второй шаг Android будет охватывать сам по себе, а третий, первый и четвертый шаги очень редки, поэтому я думаю, что могу использовать ondestroy ?? - person Sudhanshu Gaur; 24.08.2017
comment
@SudhanshuGaur: Остались ли другие дела или нет? - ничего, что я могу придумать. - person CommonsWare; 25.08.2017
comment
Не могли бы вы сказать мне, даже если я отменил регистрацию своего приемника в onstop(), тогда он все равно не будет отменен в случае сбоя приложения (первая точка) ИЛИ из-за второй точки, поэтому для первой точки и второй точки, где я могу успешно отменить регистрацию моего приемника? ? - person Sudhanshu Gaur; 03.10.2017
comment
@SudhanshuGaur: понятия не имею, извините. - person CommonsWare; 03.10.2017
comment
Итак, согласно вам, всякий раз, когда я нажимаю кнопку «Назад», ondestroy() будет вызывать каждый раз 100%, или в этом тоже есть какие-то исключения?? - person Sudhanshu Gaur; 03.10.2017
comment
@SudhanshuGaur: исключения показаны в пронумерованном списке в вопросе. Таким образом, у вас может возникнуть необработанное исключение в промежутке между нажатием пользователем кнопки НАЗАД и моментом, когда действие обычно уничтожается. Кроме того, нажатие НАЗАД не обязательно уничтожает действие (например, вы отменяете onBackPressed(), чтобы сделать что-то другое, FragmentTransaction откатывается). - person CommonsWare; 03.10.2017
comment
@CommonsWare: Можете ли вы помочь мне с любым сценарием, в котором вызывается только onDestroy() Activity? ни onPause(), ни onStop()? - person Astha Garg; 21.10.2020
comment
@AsthaGarg: Можете ли вы помочь мне с любым сценарием, в котором вызывается только onDestroy() Activity? ни onPause(), ни onStop()? -- это не должно быть возможно. Если у вас есть проект, который может воспроизвести проблему, укажите ссылку на него в отдельном вопросе о переполнении стека как часть минимально воспроизводимого примера< /а>. - person CommonsWare; 21.10.2020
comment
@CommonsWare- я получил ответ на этот вопрос, когда приложение аварийно завершает работу в onCreate of Activity, там вызывается только onDestroy(). Это был своего рода заданный вопрос интервью - person Astha Garg; 26.11.2020
comment
@AsthaGarg: Насколько я знаю, если приложение выйдет из строя в onCreate(), onDestroy() вызываться не будет. - person CommonsWare; 26.11.2020
comment
@CommonsWare о да, вы правы. Таким образом, ответ будет таким: когда мы вызываем finish() из onCreate, тогда вызывается только onDestroy. - person Astha Garg; 26.11.2020
comment
@AsthaGarg: Ах, хорошо, я не подумал об этом, когда вы первоначально задали вопрос. Я считаю, что вы правы, и активность перейдет от onCreate() к onDestroy() без вызова других методов жизненного цикла. Приношу свои извинения за то, что забыл об этом сценарии! - person CommonsWare; 26.11.2020
comment
@CommonsWare: Да .. также .. вы можете помочь мне с stackoverflow.com/questions/64328837/ ?? (Я знаю, что это неправильный способ спросить, чтобы ответить на вопрос) - person Astha Garg; 26.11.2020
comment
@AsthaGarg: Извините, я не знаю, что они для этого используют. - person CommonsWare; 26.11.2020
comment
@CommonsWare: О, ладно, без проблем :) - person Astha Garg; 26.11.2020