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

Android:在什么情况下出现的对话框会导致调用onPause()?,android,dialog,lifecycle,android-lifecycle,onpause,Android,Dialog,Lifecycle,Android Lifecycle,Onpause,Android文档中的一个片段(向下滚动到“前台生存期””行)说: 一个活动可以频繁地在前台进行转换 例如,当设备进入睡眠状态或 对话框出现 我不太明白这一点。在什么情况下会发生这种情况?只有当相关对话框的上下文与要显示对话框的活动不同时,才会调用onPause() 编辑:添加代码示例以详细说明我的疑问 按照文档中的上述引用,当显示以下代码中的AlertDialog(或仅显示对话框)时,是否应调用我的活动的onPause()方法?当显示对话框时,我是否应该看到“onPause called”日志

Android文档中的一个片段(向下滚动到“前台生存期””行)说:

一个活动可以频繁地在前台进行转换 例如,当设备进入睡眠状态或 对话框出现

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

编辑:添加代码示例以详细说明我的疑问 按照文档中的上述引用,当显示以下代码中的
AlertDialog
(或仅显示
对话框
)时,是否应调用我的活动的
onPause()
方法?当显示对话框时,我是否应该看到“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");
    }
}

每次当一个活动进入后台并且
对话框
或其他
活动
进入前台时,都会调用
onPause()
。这样做是为了给用户与之交互的东西以第一优先级。e、 g:假设您处于应用程序的主屏幕(这反过来又是一个活动),则主屏幕被称为处于
前台
。当你按下某个按钮进入下一个屏幕或出现一个对话框时,下一个
屏幕/活动/对话框
进入前台,而主屏幕进入后台,这只意味着主屏幕的
暂停()
方法被调用。

我想我记得在Android生命周期的早期版本中读到,在没有显示任何活动时调用了onPause。i、 e.如果在弹出窗口下仍然可以看到您的一点活动,则不会调用onPause


也许其他一些专家可以证明这种行为?

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

不确定它是否有用,但至少您现在知道还有其他人体验到了您的体验:-)

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


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

在我稍微奇怪的经历中
onResume
使用
对话框调用。setCanceledOnTouchOut(true)
但从不调用onPause


话虽如此,我认为文档可能关注系统对话框(例如电池电量不足)。

错误的是,在onPause阶段,活动不再位于活动堆栈的顶部

将活动设置为“暂停”状态-

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

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

    e、 g按下Home(主页)按钮会导致活动进入暂停()。仍处于堆栈顶部

在图1中。活动3将被销毁并从顶部堆栈中移除

在图2中。现在任务A转到后台,但activtyX仍然位于堆栈顶部。如果在该状态中重写onPause()方法

图1。表示任务中的每个新活动如何将项添加到后堆栈中。当用户按下后退按钮时,当前活动将被销毁,而上一个活动将继续

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

@hackbot

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

一切取决于实施

什么是对话?WindowManager是否将窗口添加到显示中/// 因此,当窗口显示时,它位于一切之上。。。。(Z命令)

什么是活动。。。也是创建窗口的“东西”

当显示对话框或其窗口在现有活动顶部可见时,它将覆盖部分活动窗口,因此现有活动将移动到部分不可见状态,并且您将从ActivityThread调用onPause()

当然,我们也需要考虑一下……p> 窗口if的状态是顶部显示的独立窗口,或者是子窗口,其父窗口是活动窗口。

所以当我们知道

  • 我们用来添加的窗口.布局参数(标志)
  • 窗口使用的是什么IBinder
我们将了解窗口相互重叠时活动的行为。。正如每个winndow都有一个回调它们被活动或对话框用来管理