AlertDialog弹出后Activity的onPause方法未被调用

3
我尝试了以下代码来检查Activity的回调函数,据我的理解,无论何时对话框出现在Activity的上方,都应该调用Activity的OnPause()方法。当对话框消失时,Activity的OnResume()应该触发。

令人惊讶的是,它没有按照应该工作的方式进行。我已经在Android M 6.0.1上测试过了。

如果我有任何错误,请纠正我,这里是我的代码:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onPause() {
        Log.d("MainActivity", "onPause");
        super.onPause();
    }

    @Override
    protected void onResume() {
        Log.d("MainActivity", "onResume");
        super.onResume();
    }

    @Override
    protected void onStart() {
        super.onStart();
    }

    @Override
    protected void onStop() {
        super.onStop();
    }


    public void onClick(View view) {
        AlertDialog.Builder builder;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            builder = new AlertDialog.Builder(MainActivity.this, android.R.style.Theme_Material_Dialog_Alert);
        } else {
            builder = new AlertDialog.Builder(MainActivity.this);
        }
        builder.setTitle("Delete entry")
                .setMessage("Are you sure you want to delete this entry?")
                .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        // continue with delete
                    }
                })
                .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        // do nothing
                    }
                })
                .setIcon(android.R.drawable.ic_dialog_alert)
                .show();
    }
}  

你完全没使用你的AlertDialog!使用.show()或在onCreate中使用你的onClick类。 - Mehran Zamani
除非有对话框主题的活动,否则您将不会收到此类回调。 - Keyur Thumar
2个回答

10
我试过以下代码来检查Activity的回调函数,根据我的理解,当对话框出现在Activity上方时,Activity的OnPause()方法应该被调用。当对话框消失时,Activity的OnResume()应该被触发。但实际上文档有点混乱。当你在Activity上方调用一个对话框时,Activity的onPause()将永远不会被调用。换句话说,对话框总是与调用Activity绑定在一起,如果该Activity没有运行,那么对话框怎么可能可见呢?实际上,只有在调用另一个作为对话框的Activity(使用对话框主题或不覆盖全屏的Activity)时,onPause()才会被调用。

来自文档

onPause()

  • 一个新的半透明活动(如对话框)打开。 只要活动仍然部分可见但不在焦点中,它就保持暂停状态。

您还可以阅读Android:在什么情况下出现对话框会导致调用onPause()?


7

onPause()方法在你的活动不再处于活动堆栈的顶部时调用。Dialog本身不是一个活动,因此不会替换当前位于堆栈顶部的活动,因此onPause()永远不会被调用。

但是,如果您将Dialog实现为一个Activity:(一个具有对话框主题的活动)。在这种情况下,当将对话框显示为一个活动时,会导致新活动处于堆栈顶部,从而调用onPause()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接