Подтвердить что ты не робот

Что именно делает метод Activity.finish()?

Я занимаюсь разработкой приложений для Android некоторое время и слежу за множеством сообщений о жизненном цикле активности и жизненном цикле приложений.

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

Я пришел на этот пост - Отказался от приложения, нахмурившегося? и прочитал ответ Марка Мерфи.

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

Есть ли вероятность, что я позвоню finish() и onDestroy() не будет вызываться?

4b9b3361

Ответ 1

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

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

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

Ответ 2

Мои 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()

Ответ 3

Также обратите внимание, если вы назовете finish() после намерения, вы не сможете вернуться к предыдущему действию с помощью кнопки "назад"

startActivity(intent);
finish();

Ответ 4

onDestroy() предназначен для окончательной очистки - освобождения ресурсов, которые вы можете самостоятельно, закрывая открытые соединения, читателей, писателей и т.д. Если вы не переопределите его, система сделает то, что ему нужно.

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

Что-то примечание:

не обязательно, чтобы вызов finish() вызывал вызов onDestroy(). Нет. Как известно, система Android может убивать действия, если она считает, что нужны текущие Activity ресурсы, необходимые для освобождения.

Ответ 5

Метод Finish() уничтожит текущую активность. Вы можете использовать этот метод в случаях, когда вы не хотите, чтобы эта активность загружалась снова и снова, когда пользователь нажимает кнопку "Назад". В основном он очищает активность из стека. Current.

Ответ 6

Различные ответы и примечания утверждают, что finish() может пропустить onPause() и onStop() и непосредственно выполнить onDestroy(). Справедливости ради стоит отметить документацию на Android (http://developer.android.com/reference/android/app/Activity.html): "Активность заканчивается или уничтожается системой", что довольно неоднозначно, но может предположить, что finish() может перейти к onDestroy().

JavaDoc on finish() также разочаровывает (http://developer.android.com/reference/android/app/Activity.html#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");
    }

}

Ответ 7

@user3282164 В соответствии с Activity жизненный цикл должен пройти onPause()onStop()onDestroy() при вызове finish().

Диаграмма не показывает прямой путь от [Activity Running] до [ onDestroy()], вызванного системой.

onStop() doc говорит "Обратите внимание, что этот метод может вызываться никогда, в ситуациях с низкой памятью, где в системе недостаточно памяти для поддержания активности вашего процесса после вызова метода onPause().

Ответ 8

В моем исследовании показано, что метод finish() фактически помещает некоторые операции уничтожения в очередь, но действие не сразу уничтожается. Однако уничтожение запланировано.

Например, если вы поместите finish() в onActivityResult() обратный вызов, а onResume() еще не запущен, тогда будет выполнен первый onResume(), и только после этого будут вызваны onStop() и onDestroy().

ПРИМЕЧАНИЕ. onDestroy() может вообще не вызываться, как указано в документации.

Ответ 9

В дополнение к ответу @rommex выше, я также заметил, что finish() блокирует уничтожение Activity и зависит от приоритета Activity.

Если я назову finish() после onPause(), я вижу onStop() и onDestroy(), который onDestroy() немедленно.

Если я назову finish() после onStop(), я не вижу onDestroy() до 5 минут позже.

По моим наблюдениям, похоже, что финиш поставлен в очередь, и когда я посмотрел на adb shell dumpsys activity activities он был установлен как adb shell dumpsys activity activities finishing=true, но поскольку он больше не находится на переднем плане, для его уничтожения не было приоритета.

Таким образом, onDestroy() никогда не будет гарантированно вызван, но даже в том случае, когда он вызывается, он может быть отложен.

Ответ 10

вызов завершения в onCreate() не будет вызывать onDestroy() напрямую, как сказал @prakash. Операция finish() не начнется, пока вы не вернете управление Android.

Вызов finish() в onCreate(): onCreate() → onStart() → onResume(). Если пользователь выйдет из приложения, вызовет → onPause() → onStop() → onDestroy()

Вызов finish() в onStart(): onCreate() → onStart() → onStop() → onDestroy()

Calling finish() в onResume(): onCreate() → onStart() → onResume() → onPause() → onStop() → onDestroy()

Для дополнительной справки посмотрите oncreate непрерывный после финиша и о финише()

Ответ 11

Кажется, единственный верный ответ, который до сих пор был дан romnex: "onDestroy() вообще не может быть вызван". Хотя на практике почти во всех случаях это будет, нет никакой гарантии: документация на финише() только promises, что результат активность распространяется обратно на вызывающего абонента, но не более того. Кроме того, документация по жизненному циклу поясняет, что эта активность может быть уничтожена ОС, как только onStop() закончит (или даже раньше на старых устройствах), что, хотя это маловероятно и поэтому редко встречается в простом тесте, может означать, что активность может быть убита во время или даже до того, как выполняется onDestroy().

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

Ответ 12

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