Android:在什么情况下会出现Dialog导致onPause()被调用?

cur*_*zen 74 lifecycle android dialog android-lifecycle onpause

Android 活动文档中的一个片段(向下滚动到" 前景生命周期 "行)说:

活动可以频繁地进出前台 - 例如,onPause()当设备进入睡眠状态或出现对话框时调用.

我不太明白这一点.在什么情况下会发生这种情况?被onPause()称为仅如果有问题的对话的上下文是从顶部其活性的对话框将显示不同?

编辑:添加代码示例以详细说明我的疑问

通过文档中的上述引用,onPause()当下面代码中的AlertDialog(或只是Dialog)显示时,我的activity的方法是否会被调用?显示对话框时,我应该看到"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");
    }
}
Run Code Online (Sandbox Code Playgroud)

hac*_*bod 177

onPause()当您的活动不再位于活动堆栈的顶部时调用.Dialog本身不是Activity,因此不会替换堆栈顶部的当前Activity,因此不会导致任何暂停.

但是,对话框(小写)不需要由Dialog类实现.例如,使用Activity的主题设置为对话框的Activity实现一个并不罕见.在这种情况下,显示对话框作为活动将导致新的活动位于堆栈的顶部,暂停之前的活动.

  • 很好的答案.我没有想到"对话即活动".并且只有在对话框位于堆栈顶部时才调用`onPause()`的原因 - 这也解释了为什么即使通知栏被拉到底部也不会调用`onPause()`,这完全模糊了活动. (8认同)
  • @curioustechizen这里有太多的细微之处......感谢你的问题(以及Android团队这位了不起的专业人士的答案),我已经能够很快理解为什么我在我的应用程序中正好观察你观察到的内容.+1. (2认同)

Mic*_*Bak 12

我一直在用对话框做很多代码,包括AlertDialog你提到的那些代码,我还试图检查onPause()当对话框弹出时是否正在调用活动,但到目前为止我的结论是简单的活动继续运行,onPause() 而不是被调用.

不确定它是否有帮助,但至少你现在知道还有其他人经历过你正在经历的事情:-)