Android: При каких обстоятельствах будет вызываться диалог, вызывающий onPause()?

Отсканированный фрагмент документа Activities (прокрутите вниз до строки

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

Я не совсем понимаю это. При каких обстоятельствах это должно произойти? Вызывается ли onPause() только в том случае, если контекст рассматриваемого диалогового окна отличается от действия, над которым должно отображаться диалоговое окно?

EDIT: добавление образца кода, чтобы подробно проиллюстрировать мои сомнения

В соответствии с вышеупомянутой цитатой из документа, должен ли мой метод onPause() вызываться, когда отображается AlertDialog (или просто Dialog) в следующем коде? Должен ли я видеть запись "onPause called" в журнале, когда отображается диалог?

Но я этого не вижу. И это тоже не должно, если я правильно понял жизненный цикл Android! Итак, какой документ указывается тогда?

public class LifeCycleTestActivity extends Activity {

    private static final String TAG = "LifeCycleTest";

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button btn = (Button) findViewById(R.id.button1);

        btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Log.d(TAG, "onClick");

                AlertDialog dialog = new AlertDialog.Builder(LifeCycleTestActivity.this).create();
                 dialog.setMessage("You Clicked on the button");
                 dialog.setTitle("Dialog!");
                 dialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK", new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                });
                 dialog.setCancelable(true);
                 dialog.show();


                /*
                Dialog dialog = new Dialog(LifeCycleTestActivity.this);
                 dialog.setTitle("Dialog!");
                 dialog.setCancelable(true);
                 dialog.show();
                */
            }
        });        
    }

    @Override
    protected void onPause() {
        Log.d(TAG, "onPause() called");
        super.onPause();

    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume() called");
    }
}

Ответ 1

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

Диалоговое окно (нижний регистр) не обязательно должно выполняться классом Dialog. Например, это не редкость реализовать один с Activity, тема которого установлена ​​в диалоговом окне. В этом случае отображение диалога-как-Activity приведет к тому, что новое действие будет находиться в верхней части стека, остановив предыдущее.

Ответ 2

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

Не уверен, что это помогает, но по крайней мере теперь вы знаете, что есть другие, которые испытывают то, что вы испытываете: -)

Ответ 3

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

Возможно, некоторые другие эксперты могут ручаться за это поведение?

Ответ 4

В моем немного странном опыте onResume вызывается с dialog.setCanceledOnTouchOutside(true);, но onPause никогда не вызывается.

Считаю, что документация может быть сосредоточена на системных диалогах (например, на батарее).

Ответ 5

Неправильно то, что в фазе onPause активность больше не находится на вершине стека активности.

Состояние действия, которое должно быть в состоянииPause -

  • Активность частично видимая, например. диалог по активности.
  • Объект Activity сохраняется в памяти, он поддерживает всю информацию о состоянии и члене и остается прикрепленным к диспетчеру окон.

    например, нажатие кнопки Home приводит к тому, что активность переходит в onPause(). Все еще наверху стека.

На рисунке 1. Activity3 будет уничтожен и удален из верхнего стека

На рис. 2. Теперь задача A переходит на задний план, но Activit X все еще находится поверх стека. Если вы переопределите метод onPause() int это состояние

enter image description here

Рисунок 1. Представление того, как каждое новое действие в задаче добавляет элемент в задний стек. Когда пользователь нажимает кнопку "Назад", текущая активность уничтожается, и предыдущее действие возобновляется.

enter image description here

Рисунок 2. Две задачи: задача B принимает взаимодействие пользователя на переднем плане, а задача A находится в фоновом режиме, ожидая возобновления.

Ответ 6

onPause() вызывается каждый раз, когда действие переходит в фоновый режим, а Dialog или другое Activity - для начала. Это делается для того, чтобы дать первостепенное значение тому, с чем взаимодействует пользователь. например: предположим, что вы находитесь в рабочем столе (который, в свою очередь, является активностью) приложения, рабочий стол, как говорят, находится в foreground. и когда вы переходите к следующему экрану, нажимая какую-нибудь кнопку или появляется диалоговое окно, следующий screen/Activity/Dialog приходит к foreground и homecreen переходит на backGround, что означает только homeScreen onPause() вызван.