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

时间:2011-08-30 09:06:47

标签: android dialog lifecycle android-lifecycle onpause

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

  

活动可以频繁地进出前景   例如,当设备进入休眠状态 或a时,会调用onPause()   出现对话框

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

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

根据文档中的上述引用,如果以下代码中的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 个答案:

答案 0 :(得分:171)

当您的活动不再位于活动堆栈顶部时,会调用

onPause()。 Dialog本身不是Activity,因此不会替换堆栈顶部的当前Activity,因此不会导致任何暂停。

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

答案 1 :(得分:12)

我一直在用对话框做很多代码,包括你提到的AlertDialog,我还试图在对话框中检查活动是否正在调用onPause()弹出,但到目前为止我的结论是活动只是继续运行而且onPause() 没有被称为

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

答案 2 :(得分:2)

错误的是,在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在后台,等待恢复。

答案 3 :(得分:0)

我想我记得在早期版本的Android生命周期中读到当没有活动显示时调用onPause。即如果在弹出窗口中仍然可以看到您的某些活动,则不会调用onPause。

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

答案 4 :(得分:0)

在我稍微有点奇怪的体验中onResume会被dialog.setCanceledOnTouchOutside(true);调用,但onPause永远不会被调用。

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

答案 5 :(得分:0)

@hackbot

  当您的活动不再位于活动>堆栈顶部时,将调用

onPause()。对话框本身不是活动,因此不会替换堆栈顶部的当前>活动,因此不会导致任何暂停。

一切都取决于执行情况...

什么是对话框?是由WindowManager添加到“显示”中的一个窗口 /// 因此显示时的窗口位于所有内容的顶部。(Z顺序)

什么是活动...是同时创建其窗口的“事物” ....

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

但是要确保我们在这里还需要考虑一个想法...

窗口状态是顶部显示的独立窗口还是它是子窗口而父窗口是活动窗口。 ...

所以我们知道

  • 我们用来添加的 Window.LayoutParams (FLAGS)
  • 以及 IBinder 用于窗口显示

我们将了解当窗口彼此显示时活动的行为。.每个窗口都具有回调,活动或对话框将使用它们来管理其状态...

涉及的组件:

  • android.os.IBinder

  • android.view.Window

  • android.view.Window.Callback

  • android.view.WindowManager

  • android.view.WindowManager.LayoutParams

  • android.view.Display

btw:

如果您想知道屏幕上的窗口[仅适用于您拥有的进程-窗口属于进程,而这些窗口是沙盒-每个进程都是一个单独的JVM,严格说“ ART”],则可以使用replection:

  • android.view.WindowManagerImpl
  • android.view.WindowManagerGlobal

答案 6 :(得分:-4)

每当活动进入后台并且onPause()或其他Dialog来到foreGround时,就会调用{p> Activity。这样做是为了优先考虑用户正在与之交互的事物。例如:假设您处于应用程序的主屏幕(进而是一项活动),主屏幕被称为foreground。当你按下某个按钮进入下一个屏幕或出现一个对话框时,下一个screen/Activity/Dialog进入foreGround主屏幕进入backGround,这意味着 homeScreen的< / strong> onPause()方法被调用。