Разница между onPause и onStop () - PullRequest
136 голосов
/ 13 февраля 2012

Из документа Android здесь http://developer.android.com/reference/android/app/Activity.html, сказано, что «Активность выходит на передний план» вызовет onPause(), а «Активность больше не видна» - onStop().

Не«Активность выходит на передний план» так же, как «Активность больше не видна»?Подскажите, пожалуйста, в чем разница между ними?

Ответы [ 8 ]

99 голосов
/ 13 февраля 2012

Нет, если какая-то деятельность выходит на передний план, это не обязательно означает, что другая деятельность полностью невидима. Рассмотрим следующий случай:

Activity with the theme Theme.Dialog

Здесь мы видим оба вида деятельности одновременно. Первое действие с полями скрыто другим действием, и пользователь больше не может взаимодействовать с ним. Тем не менее, это все еще видно со всеми вытекающими последствиями.

Это оставляет вопрос, какая деятельность считается полностью непрозрачной и охватывает весь экран, а какая нет. Это решение основано на окне, содержащем действие. Если у окна есть флаг windowIsFloating или windowIsTranslucent, то считается, что действие не делает основной материал невидимым, в противном случае оно вызывает и будет вызывать onStop(). Соответствующий код можно найти в com.android.server.am.ActivityRecord:

fullscreen = ent != null && !ent.array.getBoolean(
        com.android.internal.R.styleable.Window_windowIsFloating, false)
        && !ent.array.getBoolean(
        com.android.internal.R.styleable.Window_windowIsTranslucent, false);
33 голосов
/ 13 февраля 2012

Если вы все еще можете видеть какую-либо его часть (Activity выходит на передний план или не занимает весь экран, или он несколько прозрачен), будет вызван onPause(). Если вы не видите ни одной его части, будет вызван onStop().

Например, диалог ** может не охватывать весь предыдущий Activity, и это будет время для вызова onPause().

** Я имею в виду не Android-диалог, а скорее концептуальную идею чего-то, что всплывает и только затемняет часть пользовательского экрана. Это примечание было добавлено для уточнения на основе комментария от @GMsoF ниже

10 голосов
/ 13 февраля 2012

Нахождение на переднем плане означает, что у действия есть фокус ввода. Например, активность может быть видимой, но частично скрытой диалогом, который имеет фокус. В этом случае будет вызываться onPause(), но не onStop(). Когда диалоговое окно исчезнет, ​​будет вызван метод действия onResume() (но не onStart()).

2 голосов
/ 18 июня 2018

Практически , следует учитывать разницу между «onPause ()» и «onPause () + onStop ()».

Всякий раз, когда происходит какое-то новое действие, и оно занимает часть экрана. Таким образом, ваша ранее запущенная активность все еще видна до некоторой степени. В этом случае ранее запущенное действие не переносится в Back Stack. Итак, здесь вызывается только метод onPause () .

С другой стороны, если какое-то новое действие происходит и занимает весь экран, так что ранее выполненное действие исчезло. В этом случае ваше ранее запущенное действие перемещается в Back Stack. Здесь вызываются onPause () + onStop ().

К резюме-

onPause () - Экран частично покрыт другими новыми действиями. Действие не перемещается в Back Stack.

onPause () + onStop () - Экран полностью покрыт другими новыми действиями. Действие перенесено в Back Stack.

Узнайте больше о Back Stack .

0 голосов
/ 27 октября 2018

Я столкнулся со многими проблемами с методами onPause и onStop, и поэтому я проясню три сценария, с которыми я столкнулся -
1. Когда вы нажимаете кнопку недавнего приложения, метод жизненного цикла не вызываетсяно onWindowFocusChanged (логический hasFocus) вызывается со значением hasFocus, переданным как false.В версии для Android до 5, метод onPause, используемый для вызова, при нажатии кнопки недавнего приложения.

2. Когда всплывающее действие похоже на вашу активность, как указано Малкольм , кнопка onPause вызывается.Если вызывается новая активность, занимающая весь экран, то onStop вызывается для предыдущей активности.Android диалоговое окно разрешений также приводит к тому, что ваша активность вызывает onPause.

3. Если на экране отображается тайм-аут вашей активности, вызывается onPause.Через некоторое время, если вы не откроете экран, будет вызван onStop.

Также одна важная вещь, упомянутая ateiob , которая завершает ответ

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


Надеюсь, это поможет.

0 голосов
/ 03 июля 2018

Вкратце:

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

Примечание : Действия - это те компоненты, которые заполняют весь ваш экран.

Примечание : диалоги не являются активностью, поскольку они не полностью заполняют экран.

0 голосов
/ 01 ноября 2017

всякий раз, когда новый ACTIVITY начинает предыдущее действие, onPause будет вызывающе вызываться при любых обстоятельствах.

на самом деле будет два обстоятельства:

1- часть предыдущего действия видна или новое действие прозрачно: будет вызываться только onPause.

2- предыдущая деятельность полностью покрыта новой деятельностью: и onPause, и onStop будут называться

---- Хорошо бы изложить некоторые заметки:

ПРИМЕЧАНИЕ 1: если диалоговое окно начинается поверх действия, не будет вызвано ни одного из onPause или onStop.

ПРИМЕЧАНИЕ 2: если это действие, тема которого настроена на диалог, поведение будет таким же, как обычное действие.

ПРИМЕЧАНИЕ 3: очевидно, системный диалог, такой как диалог разрешений, поскольку зефир вызовет onPause.

0 голосов
/ 27 октября 2014

Да, я пытаюсь понять и могу объяснить это ниже:

Есть 2 действия: ActivityA и ActivityB

public class ActivityA extends Activity implements OnClickListener {

// button
private Button mBtnChangeActivity;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_a);
    initialize();
    setEvent();
}

private void initialize() {
    Log.i("Activity A", "Initialize()");
    mBtnChangeActivity = (Button) findViewById(R.id.btn_change_activity);
}

private void setEvent() {
    Log.i("Activity A", "setEvent()");
    mBtnChangeActivity.setOnClickListener(this);
}

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

@Override
protected void onResume() {
    super.onResume();
    Log.i("Activity A", "onResume");
}

@Override
protected void onPause() {
    super.onPause();
    Log.i("Activity A", "onPause");
}

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

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

@Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.btn_change_activity:
        Intent activityB = new Intent(this, ActivityB.class);
        startActivity(activityB);
        break;
    default:
        break;
    }
}

Вот упражнение B. Следуйте моему комментарию в коде

public class ActivityB extends Activity implements OnClickListener {

// button
private Button mBtnChangeActivity;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_a);
    initialize();
    setEvent();
    // if call finish() here, activityA will don't stop, just pause
    // Activity A will call onStop() when Activity B call onStart() method
    finish();
}

private void initialize() {
    Log.i("Activity B", "Initialize()");
    mBtnChangeActivity = (Button) findViewById(R.id.btn_change_activity);
}

private void setEvent() {
    Log.i("Activity B", "setEvent()");
    mBtnChangeActivity.setOnClickListener(this);
}

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

@Override
protected void onResume() {
    super.onResume();
    Log.i("Activity B", "onResume");
}


@Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.btn_change_activity:
        finish();
        break;
    default:
        break;
    }
}
}

Надеюсь, это ясно

...