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


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

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

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

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

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

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

7 ответов:

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

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

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

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

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

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

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

    например, кнопка Home нажата вызывает активность, чтобы войти в onPause (). Все еще на вершине стек.

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

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

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)

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

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

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

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

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

  • the

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