В чем разница между onPause() и onStop()() Android Activites?

От android doc здесь http://developer.android.com/reference/android/app/Activity.html, он сказал, что "Активность выходит на передний план" вызовет onPause(), а "Activity is not more visible" будет вызывать onStop().

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

Ответ 1

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

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);

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

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

К Summaries-

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

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

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

Ответ 5

На следующей диаграмме показаны важные пути состояния Activity. Квадратные прямоугольники представляют собой методы обратного вызова, которые вы можете реализовать для выполнения операций, когда активность перемещается между состояниями. Цветные овалы - это основные состояния, в которых может находиться активность. The following diagram shows the important state paths of an Activity.

Ответ 6

всякий раз, когда новая ДЕЯТЕЛЬНОСТЬ запускается, предыдущая операция onPause будет вызывающе вызываться при любых обстоятельствах.

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

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

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

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

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

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

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

Ответ 7

Вкратце:

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

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

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

Ответ 8

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

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

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

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

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


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

Ответ 9

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

Есть 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;
    }
}
}

Я надеюсь, что это явно