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

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

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

Я не совсем понимаю этого. При каких обстоятельствах это должно произойти? Is 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");
    }
}

7 ответов


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

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


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

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


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

условие активности, чтобы быть состояние onPause -

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

    e.G нажатие кнопки Home вызывает активность в onPause (). Еще на вершине стек.

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

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

enter image description here

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

enter image description here

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


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

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


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

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


@hackbot

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

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

что это Диалог ? окно добавлено для отображения WindowManager/// поэтому окно, когда оно показывает, находится на вершине всего. .... (Порядок по оси Z)

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

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

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

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

Итак, когда мы знаем!--10-->

  • the

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