首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android:在什么情况下出现对话框会导致调用onPause()?

Android:在什么情况下出现对话框会导致调用onPause()?
EN

Stack Overflow用户
提问于 2011-08-30 17:06:47
回答 7查看 28.4K关注 0票数 81

安卓Activities文档中的一段代码(向下滚动到“前台生命周期”行)写道:

活动可以频繁地切换到和移出前台-例如,当设备进入休眠状态()或当对话框显示为时,将调用onPause()

我不太明白这点。在什么情况下应该发生这种情况?只有当对话框的上下文与要在其上显示对话框的活动不同时,才调用onPause()吗?

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

根据上述文档中的引用,当显示以下代码中的AlertDialog (或仅是Dialog)时,是否应该调用我的活动的onPause()方法?当对话框显示时,我应该看到"onPause called“日志条目吗?

但我不认为这会发生。如果我正确地理解了Android的生命周期,那么它也不应该!那么,文档指向的是什么呢?

代码语言:javascript
复制
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");
    }
}
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-09-12 15:52:24

当您的activity不再位于activity堆栈的顶部时,将调用onPause()。对话框本身不是活动,因此不会替换堆栈顶部的当前活动,因此不会导致任何暂停。

但是,对话框(小写)不需要由dialog类实现。例如,通过将活动的主题设置为对话的活动来实现的情况并不少见。在这种情况下,显示dialog-as-an-Activity将导致新的活动位于堆栈的顶部,暂停以前存在的内容。

票数 192
EN

Stack Overflow用户

发布于 2011-09-08 17:43:34

我已经用对话框做了相当多的代码,包括您提到的AlertDialog,我还试图检查当对话框弹出时是否在活动上调用onPause(),但到目前为止,我的结论是活动只是继续运行,onPause() 不是

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

票数 13
EN

Stack Overflow用户

发布于 2014-06-07 10:34:44

在onPause阶段,activity不再位于activity堆栈的顶部,这是错误的。

将活动条件设置为onPause状态-

  • 活动部分可见,例如活动对话框。

  • 活动对象保留在内存中,它维护所有状态和成员信息,并保持与窗口管理器的连接。

例如,按下主页按钮会导致活动转到onPause()中。仍然在堆栈的顶部。

在图1中,Activity3将被销毁并从顶层堆栈中删除

在图2中。现在任务A转到后台,但活动X仍然在堆栈顶部。如果在此状态下重写onPause()方法

图1.任务中的每个新活动如何将项目添加到后台堆栈的表示当用户按下Back按钮时,当前活动将被销毁,前一活动将恢复。

图2.两个任务:任务B在前台接收用户交互,而任务A在后台,等待恢复。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7240916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档