какая именно деятельность.finish () метод делает?


я разрабатываю приложения для android на некоторое время и следил за множеством сообщений о жизненном цикле активности и жизненном цикле приложения.

Я знаю Activity.finish() метод вызывает где-то на пути к Activity.onDestroy(), а также удаление активности из стека, и я думаю, что это каким-то образом указывает на операционную систему и сборщик мусора, что он может "сделать свой трюк" и освободить память, когда он найдет это хорошее время....

Я пришел на этот пост - Это прекращать приложения с неодобрением? и прочитал ответ Марка Мерфи.

Это заставило меня немного смущает, что именно finish() способ на самом деле.

есть ли шанс, что я позвоню finish() и onDestroy() не назовешь?

12 119

12 ответов:

при вызове finish() на деятельность, метод onDestroy() выполняется этот метод может делать вещи, как:

  1. отклонить все диалоги, которыми управляла деятельность.
  2. закройте все курсоры, которыми управляла активность.
  3. закройте любой открытый диалог поиска

и onDestroy() это не деструктор. Это на самом деле не уничтожает объект. Это просто метод, который называется на основе определенное состояние. Так что ваш экземпляр все еще жив и очень хорошо* после суперкласса onDestroy() бежит и возвращает.Android сохраняет процессы вокруг в случае, если пользователь хочет перезапустить приложение, это делает фазу запуска быстрее. Процесс не будет ничего делать, и если память должна быть восстановлена, процесс будет убит

мои 2 цента на @K_Anas ответ. Я выполнил простой тест по методу finish (). Перечислены важные методы обратного вызова в жизненном цикле активности

  1. вызов finish () в onCreate (): onCreate () - > onDestroy ()
  2. вызов finish () в onStart ():метод onCreate() -> вызова метода onStart() -> то onStop() -> onDestroy()
  3. вызов 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 (), прямо перед фактическим вызовом.

finish () просто отправляет назад к предыдущей активности в android, или, может быть, вы можете сказать, что он собирается на один шаг назад в приложении