Я занимаюсь разработкой приложений для Android некоторое время и следил за множеством постов о жизненном цикле активности и жизненном цикле приложения.
Я знаю, что Activity.finish()
вызовы методов где-то на пути Activity.onDestroy()
, а также удаление активности из стека, и я предполагаю, что это как-то указывает на операционную систему и сборщик мусора, которые он может "сделать свое дело" и освободить память, когда он находит, что это хорошее время, делая так....
Я пришел к этому сообщению - не одобряется ли выход из приложения? и прочитайте ответ Марка Мерфи.
Это немного смутило меня из-за того, что именно finish()
делает метод.
Есть ли шанс, что я позвоню finish()
и onDestroy()
не позвоню ?
Ответы:
При вызове
finish()
действия методonDestroy()
выполняется. Этот метод может делать такие вещи, как:Кроме того,
onDestroy()
не деструктор. Это на самом деле не разрушает объект. Это просто метод, который вызывается на основе определенного состояния. Таким образом, ваш экземпляр все еще жив и очень хорошо * послеonDestroy()
запуска и возврата суперкласса. Android поддерживает процессы в случае, если пользователь захочет перезапустить приложение, это ускоряет этап запуска. Процесс не будет ничего делать, и если память потребуется восстановить, процесс будет убитисточник
Мои 2 цента на @K_Anas отвечают. Я выполнил простой тест на метод finish (). Перечисленные важные методы обратного вызова в жизненном цикле деятельности
Что я хочу сказать, так это то, что аналоги методов вместе с любыми методами между ними вызываются при выполнении finish ().
например:
источник
Также обратите внимание, что если вы вызываете finish () после намерения, вы не можете вернуться к предыдущему действию с помощью кнопки «назад».
источник
onDestroy()
предназначен для окончательной очистки - освобождения ресурсов, которые вы можете самостоятельно, закрытия открытых соединений, читателей, писателей и т. д. Если вы не переопределите это, система сделает то, что должна.с другой стороны,
finish()
просто сообщает системе, что программист хочет, чтобы токActivity
был завершен. И, следовательно, он вызываетonDestroy()
после этого.На что обратить внимание:
не обязательно, чтобы только вызов
finish()
инициировал вызовonDestroy()
. Нет. Как мы знаем, система Android может свободно убивать действия, если она чувствует, что существуют ресурсы, необходимые для токаActivity
, которые необходимо освободить.источник
finish()
говорит системе закончитьActivity
. часть «x» в вашем утверждении do - «закончить (уничтожить)Activity
». Вторая часть неверна. На самом деле, я пропустил там слово. Я отредактировал ответ.onDestroy()
не только вызываетсяfinish()
, система может вызывать это и сама.Метод Finish () уничтожит текущую активность. Вы можете использовать этот метод в тех случаях, когда вы не хотите, чтобы это действие загружалось снова и снова, когда пользователь нажимает кнопку «Назад». В основном это очищает активность от стека .current.
источник
В дополнение к ответу @rommex выше, я также заметил, что
finish()
очередь уничтожает активность и что она зависит от приоритета активности.Если я позвоню
finish()
послеonPause()
, я увижуonStop()
иonDestroy()
сразу позвоню .Если я позвоню
finish()
послеonStop()
, я не увижуonDestroy()
до 5 минут спустя.По моим наблюдениям, похоже, что финиш поставлен в очередь, и когда я посмотрел на
adb shell dumpsys activity activities
него, он был установленfinishing=true
, но, поскольку он больше не находится на переднем плане, он не был приоритетным для уничтожения.Таким образом,
onDestroy()
никогда не гарантируется, что он будет вызван, но даже в случае его вызова он может быть отложен.источник
В различных ответах и примечаниях утверждается, что finish () может пропускать onPause () и onStop () и напрямую выполнять onDestroy (). Чтобы быть справедливым, документация Android на этом ( http://developer.android.com/reference/android/app/Activity.html ) отмечается, что «активность завершается или уничтожается системой», что довольно неоднозначно, но может указывать, что отделка () может перейти к onDestroy ().
JavaDoc на finish () также разочаровывает ( http://developer.android.com/reference/android/app/Activity.html#finish () ) и фактически не отмечает, какие методы были вызваны в ответ на finish ().
Итак, я написал это мини-приложение ниже, которое регистрирует каждое состояние при входе. Она включает в себя кнопку, которая вызывает метод finish (), чтобы вы могли видеть журналы запускаемых методов. Этот эксперимент показал бы, что finish () действительно также вызывает onPause () и onStop (). Вот результат, который я получаю:
источник
@ user3282164 В соответствии с жизненным циклом Активности, он должен пройти
onPause()
->onStop()
->onDestroy()
после вызоваfinish()
.Диаграмма не показывает прямой путь от [Activity Running] до [
onDestroy()
], вызванный системой.В onStop () doc говорится: « Обратите внимание, что этот метод никогда не может быть вызван в ситуациях с нехваткой памяти, когда системе не хватает памяти для поддержания процесса вашей активности после вызова метода onPause () ».
источник
Мое исследование показывает, что
finish()
метод фактически помещает некоторые операции уничтожения в очередь, но действие не уничтожается немедленно. Уничтожение запланировано, хотя.Например, если вы поместите
finish()
вonActivityResult()
обратный вызов, покаonResume()
еще не запустили, то сначалаonResume()
будет выполняться, и только после этогоonStop()
иonDestroy()
будут вызваны.ПРИМЕЧАНИЕ:
onDestroy()
может не вызываться вообще, как указано в документации .источник
вызов метода finish в onCreate () не вызовет onDestroy () напрямую, как сказал @prakash.
finish()
Операция не будет даже начинать , пока не возвращает управление Android.Вызов метода finish () в onCreate () : onCreate () -> onStart () -> onResume () . При выходе пользователя приложение вызовет -> onPause () -> onStop () -> onDestroy ()
Вызов метода finish () в onStart () : onCreate () -> onStart () -> onStop () -> onDestroy ()
Вызов метода finish () в onResume () : onCreate () -> onStart () -> onResume () -> onPause () -> onStop () -> onDestroy ()
Для дальнейшей справочной проверки посмотрите на это непрерывное создание после окончания и около конца ()
источник
Похоже, что пока единственно правильный ответ дал romnex: «onDestroy () может вообще не вызываться». Несмотря на то, что на практике почти во всех случаях это не гарантируется: документация на finish () обещает только то, что результат действия будет передан обратно вызывающей стороне, но не более того. Более того, в документации жизненного цикла разъясняется, что эта операция уничтожается ОС, как только завершается onStop () (или даже раньше на старых устройствах), что, хотя и маловероятно, а потому редко наблюдается в простом тесте, может означать, что активность может быть убит во время или даже до выполнения onDestroy ().
Поэтому, если вы хотите убедиться, что какая-то работа выполнена, когда вы вызываете finish (), вы не можете поместить ее в onDestroy (), но вам нужно будет сделать то же самое место, где вы вызываете finish (), прямо перед тем, как вызвать ее.
источник
finish () просто отправляет обратно к предыдущему действию в Android, или, может быть, вы можете сказать, что он возвращается на шаг назад в приложении
источник