какая именно деятельность.finish () метод делает?
я разрабатываю приложения для android на некоторое время и следил за множеством сообщений о жизненном цикле активности и жизненном цикле приложения.
Я знаю Activity.finish()
метод вызывает где-то на пути к Activity.onDestroy()
, а также удаление активности из стека, и я думаю, что это каким-то образом указывает на операционную систему и сборщик мусора, что он может "сделать свой трюк" и освободить память, когда он найдет это хорошее время....
Я пришел на этот пост - Это прекращать приложения с неодобрением? и прочитал ответ Марка Мерфи.
Это заставило меня немного смущает, что именно finish()
способ на самом деле.
есть ли шанс, что я позвоню finish()
и onDestroy()
не назовешь?
12 ответов:
при вызове
finish()
на деятельность, методonDestroy()
выполняется этот метод может делать вещи, как:
- отклонить все диалоги, которыми управляла деятельность.
- закройте все курсоры, которыми управляла активность.
- закройте любой открытый диалог поиска
и
onDestroy()
это не деструктор. Это на самом деле не уничтожает объект. Это просто метод, который называется на основе определенное состояние. Так что ваш экземпляр все еще жив и очень хорошо* после суперклассаonDestroy()
бежит и возвращает.Android сохраняет процессы вокруг в случае, если пользователь хочет перезапустить приложение, это делает фазу запуска быстрее. Процесс не будет ничего делать, и если память должна быть восстановлена, процесс будет убит
мои 2 цента на @K_Anas ответ. Я выполнил простой тест по методу finish (). Перечислены важные методы обратного вызова в жизненном цикле активности
- вызов finish () в onCreate (): onCreate () - > onDestroy ()
- вызов finish () в onStart ():метод onCreate() -> вызова метода onStart() -> то onStop() -> onDestroy()
- вызов finish () в onResume ():метод onCreate() -> вызова метода onStart() -> onResume() -> метод onPause() -> то onStop() -> onDestroy()
Я хочу сказать, что аналоги методов вместе с любыми методами между ними вызываются при выполнении finish ().
например:
onCreate() counter part is onDestroy() onStart() counter part is onStop() onPause() counter part is onResume()
onDestroy()
предназначен для окончательной очистки-освобождение ресурсов,которые вы можете самостоятельно,закрытие открытых соединений,читателей,писателей и т. д. Если вы не переопределите его, система сделает то, что должна.С другой стороны,
finish()
просто позволяет системе знать, что программист хочет токаActivity
чтобы закончить. И, следовательно, он вызываетonDestroy()
после этого.что-то отметить:
это не обязательно только вызов
finish()
вызывает вызовonDestroy()
. Нет. Как мы знаем, система android может свободно убивать действия, если она чувствует, что есть ресурсы, необходимые для текущегоActivity
, которые должны быть освобождены.
также обратите внимание, если вы вызываете finish () после намерения вы не можете вернуться к предыдущему действию с помощью кнопки "Назад"
startActivity(intent); finish();
метод Finish () уничтожит текущую активность. Вы можете использовать этот метод в тех случаях, когда вы не хотите, чтобы это действие загружалось снова и снова, когда пользователь нажимает кнопку Назад. В основном это очищает активности.текущий стек.
различные ответы и заметки утверждают, что finish() может пропустить onPause() и onStop() и непосредственно выполнить onDestroy(). Чтобы быть справедливым, документация Android по этому вопросу (http://developer.android.com/reference/android/app/Activity.html) примечания "активность завершается или уничтожается системой", что довольно неоднозначно, но может предполагать, что finish() может перейти к onDestroy().
JavaDoc на финише () также разочаровывает (http://developer.android.com/reference/android/app/Activity.html#finish ()) и фактически не замечает, какие методы вызываются в ответ на finish ().
поэтому я написал это мини-приложение, ниже которого регистрирует каждое состояние при входе. Она включает в себя кнопку, которая вызывает finish() -- так что вы можете увидеть журналы, из которых методы уволены. Этот эксперимент предполагал бы, что finish ()действительно также вызовите onPause () и onStop (). Вот вывод я получить:
2170-2170/? D/LIFECYCLE_DEMO﹕ INSIDE: onCreate 2170-2170/? D/LIFECYCLE_DEMO﹕ INSIDE: onStart 2170-2170/? D/LIFECYCLE_DEMO﹕ INSIDE: onResume 2170-2170/? D/LIFECYCLE_DEMO﹕ User just clicked button to initiate finish() 2170-2170/? D/LIFECYCLE_DEMO﹕ INSIDE: onPause 2170-2170/? D/LIFECYCLE_DEMO﹕ INSIDE: onStop 2170-2170/? D/LIFECYCLE_DEMO﹕ INSIDE: onDestroy package com.mvvg.apps.lifecycle; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.LinearLayout; import android.widget.Toast; public class AndroidLifecycle extends Activity { private static final String TAG = "LIFECYCLE_DEMO"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "INSIDE: onCreate"); setContentView(R.layout.activity_main); LinearLayout layout = (LinearLayout) findViewById(R.id.myId); Button button = new Button(this); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { Toast.makeText(AndroidLifecycle.this, "Initiating finish()", Toast.LENGTH_SHORT).show(); Log.d(TAG, "User just clicked button to initiate finish()"); finish(); } }); layout.addView(button); } @Override protected void onStart() { super.onStart(); Log.d(TAG, "INSIDE: onStart"); } @Override protected void onStop() { super.onStop(); Log.d(TAG, "INSIDE: onStop"); } @Override protected void onDestroy() { super.onDestroy(); Log.d(TAG, "INSIDE: onDestroy"); } @Override protected void onPause() { super.onPause(); Log.d(TAG, "INSIDE: onPause"); } @Override protected void onResume() { super.onResume(); Log.d(TAG, "INSIDE: onResume"); } }
@user3282164 согласно активность жизненный цикл он должен пройти
onPause()
->onStop()
->onDestroy()
по вызовуfinish()
.на диаграмме не показан прямой путь от [Activity Running] до [
onDestroy()
], вызванные системой.onStop () док говорит "обратите внимание, что этот метод может никогда вызывается, в ситуациях с низкой памятью, когда система не имеет достаточно памяти, чтобы сохранить процесс вашей деятельности вызывается запуск после его метода onPause ()."
мое исследование показывает, что
finish()
метод фактически помещает некоторые операции уничтожения в очередь, но действие не уничтожается сразу. Однако разрушение запланировано.например, если вы размещаете
finish()
наonActivityResult()
обратный вызов, в то время какonResume()
еще предстоит запустить, тогда сначалаonResume()
будет казнен, и только после этогоonStop()
иonDestroy()
называются.Примечание:
onDestroy()
не может быть вызван вообще, как указано на документация.
вызов finish в onCreate() не вызовет onDestroy () напрямую, как сказал @prakash. Элемент
finish()
операция даже не начнется, пока вы не вернете контроль над Android.вызов метода finish () in onCreate (): onCreate () - > onStart () - > onResume(). Если пользователь выйдет из приложения вызовет - > onPause () - > onStop () - > onDestroy()
вызов метода finish () in onStart ():метод onCreate() -> функции onStart() -> то onStop() -> onDestroy()
вызов метода finish () in onResume():onCreate () - > onStart () - > onResume () - > onPause () - > onStop () - > onDestroy ()
для дальнейшей проверки ссылки посмотрите на это oncreate непрерывное после финиша & о Finish()
в дополнение к ответу @rommex выше, я также заметил, что
finish()
делает очередь уничтожения деятельности и что это зависит от приоритета деятельности.если я называю
finish()
послеonPause()
Я вижуonStop()
иonDestroy()
сразу же позвонил.если я называю
finish()
послеonStop()
, Я не вижуonDestroy()
до 5 минут позже.по моим наблюдениям, похоже, что финиш стоит в очереди, и когда я посмотрел на
adb shell dumpsys activity activities
было установленоfinishing=true
, но поскольку он больше не находится на переднем плане, он не был приоритетным для уничтожения.в целом,
onDestroy()
никогда не гарантируется, что он будет вызван, но даже в случае его вызова он может быть отложен.
похоже, что единственный правильный ответ здесь до сих пор был дан ромнексом: "onDestroy() не может быть вызван вообще". Даже если на практике, почти во всех случаях это будет, нет никакой гарантии:документация on finish () только обещает, что результат действия передается обратно вызывающему, но не более того. Более того,документация жизненного цикла уточняет, что действие может быть убито ОС, как только onStop() завершается (или даже раньше на старых устройствах), что, хотя и маловероятно и поэтому редко наблюдается в простом тесте, может означать, что активность может быть убита во время или даже до выполнения onDestroy ().
поэтому, если вы хотите убедиться, что некоторая работа выполнена при вызове finish (), вы не можете поместить ее в onDestroy (), но вам нужно будет сделать в том же месте, где вы вызываете finish (), прямо перед фактическим вызовом.