You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

onBackPressed实现带不再显示复选框的退出弹窗异常问题

问题说明
  • 需求:用户首次打开应用按返回键触发退出时,弹出带评分引导的退出确认AlertDialog;弹窗增加复选框,用户勾选后后续按返回键不再重复弹出该弹窗
  • 异常现象:现有代码实现后,用户勾选复选框无法正常退出应用
问题根因

现有代码存在3个核心逻辑错误:

  1. 执行顺序颠倒:进入onBackPressed方法后,先创建并执行了弹窗show()操作,才去读取SharedPreferences里的"不再提示"状态,导致哪怕已经勾选过不再提示,也会先创建弹窗
  2. 已勾选状态下无退出逻辑:当读取到"不再提示"状态为true时,现有代码仅执行了mDialog.hide()隐藏弹窗,没有调用super.onBackPressed()执行退出流程,自然无法退出应用
  3. 重复调用弹窗显示:代码中先手动调用了一次mDialog.show(),后续else分支又调用了一次mDialog.show(),会触发重复显示的异常
修复后代码

直接替换原有对应代码即可:

@Override
public void onBackPressed() {
    // 优先判断是否已勾选不再提示,是则直接执行退出逻辑,不创建弹窗
    if (getDialogStatus()) {
        super.onBackPressed();
        return;
    }

    // 仅需要显示弹窗时,才执行弹窗创建流程
    LayoutInflater inflater = getLayoutInflater();
    View alertLayout = inflater.inflate(R.layout.dailog_review, null);
    AlertDialog.Builder alert = new AlertDialog.Builder(this);
    CheckBox mCheckBox = alertLayout.findViewById(R.id.checkBox);
    alert.setView(alertLayout);

    alert.setNeutralButton("Exit", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            // 点击退出前保存复选框最终选中状态
            storeDialogStatus(mCheckBox.isChecked());
            HomeActivity.super.onBackPressed();
        }
    });

    alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            // 点击评分前同步保存复选框选中状态,后续不再弹出
            storeDialogStatus(mCheckBox.isChecked());
            try {
                startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + getPackageName())));
            } catch (android.content.ActivityNotFoundException anfe) {
                startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + getPackageName())));
            }
            // 如果需要点击评分后直接退出应用,取消下面这行的注释即可
            // HomeActivity.super.onBackPressed();
        }
    });

    AlertDialog mDialog = alert.create();
    mDialog.show();
}

private void storeDialogStatus(boolean isChecked){
    SharedPreferences mSharedPreferences = getSharedPreferences("CheckItem", MODE_PRIVATE);
    SharedPreferences.Editor mEditor = mSharedPreferences.edit();
    mEditor.putBoolean("item", isChecked);
    mEditor.apply();
}

private boolean getDialogStatus(){
    SharedPreferences mSharedPreferences = getSharedPreferences("CheckItem", MODE_PRIVATE);
    return mSharedPreferences.getBoolean("item", false);
}
额外提示

你当前引用的布局名dailog_review存在拼写错误,正确拼写应为dialog_review,如果编译时提示找不到布局资源,请修正该拼写问题。

内容的提问来源于stack exchange,提问作者arwanapratama

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 23:00:11