显示AlertDialog后,活动的暂停方法未被调用

时间:2017-08-09 05:28:12

标签: android android-activity alertdialog

我已尝试使用下面的代码来检查Activity的回调,根据我的理解,每当对话框出现在Activity上时,Activity的OnPause()方法都应该调用。当对话框消失时,活动的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();
    }
}  

2 个答案:

答案 0 :(得分:4)

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

onPause()Dialog本身不是一个活动,因此不会替换堆栈顶部的当前活动,因此永远不会调用 onPause()

但是,如果将Dialog实现为Activity :(主题设置为对话框的活动)。在这种情况下,将对话框显示为活动将导致新活动位于堆栈顶部,因此调用 onPause()

答案 1 :(得分:4)

  

我已经尝试过以下代码来检查Activity的回拨,从我的开始   每当对话框出现在Activity,Activity的基础上时就会理解   应该调用OnPause()方法。当对话框消失Activity时   OnResume()应该触发。

NO。 Documentation is bit confusing。当您在活动之上调用对话框时,onPause()活动将永远不会调用。以其他方式思考,对话框总是与调用活动绑定,如果该活动未处于运行状态,该对话框将如何显示?

实际上,onPause()只会在您将另一个活动作为对话框(使用对话框主题或不包含全屏的活动)时调用。

来自文档

  

onPause()

  • 将打开一个新的半透明活动(例如对话框)。只要活动仍然部分可见但不是焦点,它仍然会暂停。

您还可以阅读Android: Under what circumstances would a Dialog appearing cause onPause() to be called?