Android: при каких обстоятельствах появление диалога вызывает вызов onPause ()? - PullRequest
71 голосов
/ 30 августа 2011

Фрагмент из документа Android Активность (прокрутите вниз до строки " время жизни переднего плана "):

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

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

РЕДАКТИРОВАТЬ: Добавление образца кода, чтобы проиллюстрировать мои сомнения в деталях

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

Но я не вижу, чтобы это случилось. И не должно быть, если я правильно понял жизненный цикл 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");
    }
}

Ответы [ 7 ]

172 голосов
/ 12 сентября 2011

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

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

12 голосов
/ 08 сентября 2011

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

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

2 голосов
/ 07 июня 2014

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

Состояние активности, чтобы быть в состоянии Пауза -

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

    например, нажатие кнопки «Домой» вызывает активацию функции onPause (). Все еще на вершине стека.

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

На рисунке 2. Теперь задача A переходит в фоновый режим, но Activty X по-прежнему находится на вершине стека. Если вы переопределяете метод onPause () в этом состоянии

enter image description here

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

enter image description here

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

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

@ hackbot

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

все зависит от реализации ...

Что такое Диалог?это окно , добавленное в Display by WindowManager ///, поэтому окно, когда оно отображается, находится поверх всего .... (Z-порядок)

что такое активность ... есть "вещь, которая также создает свое окно ....

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

, но чтобы быть уверенным, что мы также должны рассмотреть здесь одну мысль ...

состояние окна if - это автономное окно , показанное вверху или , это дочернее окно, а его родительское окно - окно активности. ...

поэтому, когда мы знаем

  • Window.LayoutParams (FLAGS), мы используем для добавления
  • и что такое IBinder используется для окна, чтобы показать

мы покажем, как будет вести себя деятельность, когда окна отображаются каждый разver other .. as каждое окно имеет обратные вызовы , которые они используют действием или диалогом для управления своими состояниями ...

задействованные компоненты:

  • android.os.IBinder

  • android.view.Window

  • android.view.Window.Callback

  • android.view.WindowManager

  • android.view.WindowManager.LayoutParams

  • android.view.Display

btw:

, если вы хотите знать окна на экране [применимо только для вашего процесса - окна принадлежат процессу, а они находятся в изолированной среде - каждый процесс является строго отдельной JVMговоря "ART"], вы можете использовать репродукцию см.

  • android.view.WindowManagerImpl
  • android.view.WindowManagerGlobal
0 голосов
/ 28 февраля 2012

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

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

0 голосов
/ 07 сентября 2011

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

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

0 голосов
/ 06 сентября 2011

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

...