Какие методы вызываются в жизненном цикле активности в следующих случаях:

Допустим, у меня есть приложение Hello World с одной активностью. Я запускаю это приложение.

Какие методы вызываются в каждом случае:

  • Нажата кнопка «Домой»: ?
    Нажата кнопка «Назад»: ?
    Принят телефонный звонок: ?

Какие методы вызываются, когда пользователь снова запускает приложение с помощью значка приложения (при условии, что в ОС не было «другие приложения нуждаются в состоянии памяти»):

  • Нажата кнопка «Домой»: ?
    Нажата кнопка «Назад»: ?
    Получен телефонный звонок: ?

Спасибо всем.

Изменить: Дополнительный кредит: как пользователь может вызвать onPause, не вызывая onStop?


person user432209    schedule 16.02.2011    source источник
comment
onPause может срабатывать, когда активность находится сверху, которая не полностью заполняет экран, поэтому базовая активность все еще частично видна. В любом случае: вы можете попробовать написать простой пример и увидеть и протестировать жизненный цикл самостоятельно... вы можете использовать один из моих вопросов и код: stackoverflow.com/questions/3407192/   -  person WarrenFaith    schedule 16.02.2011
comment
Пройдитесь по этому официальному документу, и тогда вы поймете хитрости. developer.android.com/training/basics/activity-lifecycle/   -  person Han He    schedule 06.11.2014


Ответы (4)


как нажатие кнопки «Домой», так и получение звонка не удаляют активность из стека задач и будут доступны при повторном входе в приложение => onPause() => onStop().

как показано на диаграмме жизненного цикла активности, повторный ввод вызовов приложения => onRestart() => onStart() => onResume()

вместо этого нажатие кнопки «Назад» убивает активность => onPause() => onStop() => onDestroy()

повторный вход в приложение в этом случае вызывает классику => onCreate() => onStart() => onResume()

ИЗМЕНИТЬ

из http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle

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

person bigstones    schedule 16.02.2011

Чтобы понять ЖИЗНЕННЫЙ ЦИКЛ АКТИВНОСТИ, я создаю демо. См. ЗДЕСЬ

И другой пример, который я добавил.

MainActivity.java

    public class MainActivity extends AppCompatActivity {

    private static final String TAG = "State changed";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.i(TAG, "onCreate: ");
    }

    public void OpenDialog(View view) {

        final AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create(); //Read Update
        alertDialog.setTitle("hi");
        alertDialog.setMessage("this is my app");

        alertDialog.setButton("Continue..", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                // here you can add functions
                alertDialog.dismiss();
            }
        });

        alertDialog.show();  //<-- Show dialog
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i(TAG, "onStart: " );
    }

    @Override
    protected void onResume() {
        super.onResume();

        Log.i(TAG, "onResume: ");

    }

    @Override
    protected void onPause() {
        super.onPause();

        Log.i(TAG, "onPause: ");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i(TAG, "onStop: ");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i(TAG, "onRestart: ");
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.i(TAG, "onSaveInstanceState: ");
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.i(TAG, "onRestoreInstanceState: ");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i(TAG, "onDestroy: ");
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        Log.i(TAG, "onBackPressed: ");
    }

}

Пример успеха

Случай 1 = сначала щелкните значок приложения

Примечание. Здесь не отображается onRestoreInstanceState, поскольку он выполняется во время выполнения.

I/State изменено: onCreate:

I/State изменено: onStart:

I/State изменено: onResume:

Случай 2 = нажмите кнопку "Домой" (то же самое происходит, когда экран выключен или поступает вызов)

I/State изменено: onPause:

I/State изменено: onSaveInstanceState:

I/State изменено: onStop:

Случай 3 = (продолжение варианта 2) Открыть приложение через недавние

I/State изменено: onRestart:

I/State изменено: onStart:

I/State изменено: onResume:

Случай 4 = нажмите кнопку "Назад" (вызов метода onBackPressed)

I/State изменено: onPause:

I/State изменено: onStop:

I/State изменено: onDestroy:

Случай 5 = изменение конфигурации (поворот экрана)

I/State изменено: onPause:

I/State изменено: onSaveInstanceState:

I/State изменено: onStop:

I/State изменено: onDestroy:

I/State изменено: onCreate:

I/State изменено: onStart:

I/State изменено: onRestoreInstanceState:

I/State изменено: onResume:

person Arpit Patel    schedule 20.06.2016
comment
@ArpitPatel При открытии или закрытии диалога не происходит никаких изменений в жизненном цикле активности. - person Kumar M; 09.05.2017
comment
@KumarMani да, активность переходит в состояние onPaush(), когда открывается диалоговое окно, которое вы можете практически проверить. - person Arpit Patel; 09.05.2017
comment
@ArpitPatel, только что я проверил код, который вы дали, это не влияет на жизненный цикл активности. Не могли бы вы проверить это один раз? - person Kumar M; 09.05.2017
comment
Да, вы правы, onPaush() не вызывается с помощью AlertDialog.Builder, но если вы используете фрагмент диалога в то время, вызывается onPaush(). - person Arpit Patel; 09.05.2017

Сценариев может быть несколько

  1. Открытие приложения с помощью значка приложения. вызываются следующие методы

    onCreate() --> onStart() --> onResume()

  2. Когда пользователь нажимает кнопку "Домой"

    при паузе() --> при остановке()

  3. Когда пользователь возвращается в приложение из стека действий

    onRestart() --> onStart() --> onResume()

  4. Когда приложение запущено и пользователь нажимает кнопку питания

    при паузе() --> при остановке()

  5. Когда пользователь разблокирует телефон

    onRestart() --> onStart() --> onResume()

  6. Когда пользователь получает входящий звонок, пока вы находитесь в приложении

    при паузе()

  7. Когда пользователь возвращается в приложение после отключения телефонного звонка

    onResume()

  8. Когда пользователь нажимает кнопку "Назад" в приложении

    onPause() --> onStop() --> onDestroy()

  9. И когда пользователь нажимает кнопку "Домой" и проводит пальцем по стеку действий, метод app.onDestroy() может вызываться или не вызываться в зависимости от того, содержит ли ОС контекст действия или нет в соответствии с требованиями к памяти
person Community    schedule 25.01.2019
comment
пожалуйста, дайте мне знать, если я пропустил какой-либо случай - person ; 23.08.2019

Видите ли, в то время как последовательность событий может произойти с вашей программой hello world, такая же последовательность может не произойти, скажем, в видеоигре, потому что Android, вероятно, уничтожит ее из-за того, что она занимает слишком много ресурсов.

Лучший способ увидеть жизненный цикл моего приложения — переопределить все методы (onStart, onRestart,..., включая onSaveInstance и onRestoreInstance) и вставить операторы журнала в каждый из них. Вот так:

@Override
public void onDestroy() {
    // Call the super class 
    super.onDestroy();
    // Log the action
    Log.d("Debug", "onDestroy() has been called!");
}

Теперь я могу зайти в logcat и посмотреть, какие события произошли.

person f20k    schedule 16.02.2011