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

Android开发中返回原Activity时如何正确停止并关闭仍显示的ProgressDialog

问题根源

  • 执行顺序颠倒:点击事件中先执行startActivity跳转至m1,之后才创建显示ProgressDialog,此时MeditationActivity已进入后台栈,Dialog依附于后台Activity存在,且未实现你需要的「显示3秒后跳转」逻辑。
  • Dialog关闭逻辑无效:你将Dialog的销毁逻辑放在了MeditationActivity的onBackPressed回调中,但从m1页面返回时触发的是m1的onBackPressed,不会执行Meditation的该回调,Dialog永远不会被主动关闭。

修复代码

Meditation类修改后代码

public class Meditation extends AppCompatActivity  {
    // 加载框显示时长3秒
    private static final long LOADING_DELAY = 3000;
    private ActivityMeditationBinding binding;
    private ProgressDialog progressDialog;
    private final Handler delayHandler = new Handler(Looper.getMainLooper());
    private Runnable jumpTask;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityMeditationBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        findViewById(R.id.Med_1).setOnClickListener(v -> {
            // 先初始化并显示加载框
            progressDialog = new ProgressDialog(Meditation.this);
            progressDialog.setContentView(R.layout.loading_screen_first_version);
            progressDialog.setCancelable(false);
            progressDialog.show();
            
            // 定义跳转任务
            jumpTask = () -> {
                // 跳转前先销毁加载框
                if (progressDialog != null && progressDialog.isShowing()) {
                    progressDialog.dismiss();
                }
                startActivity(new Intent(Meditation.this, m1.class));
            };
            // 3秒后执行跳转
            delayHandler.postDelayed(jumpTask, LOADING_DELAY);
        });
    }

    @Override
    protected void onStop() {
        super.onStop();
        // Activity进入后台时移除未执行的跳转任务、销毁加载框兜底
        if (delayHandler != null && jumpTask != null) {
            delayHandler.removeCallbacks(jumpTask);
        }
        if (progressDialog != null && progressDialog.isShowing()) {
            progressDialog.dismiss();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 页面销毁时清空资源避免内存泄漏
        if (progressDialog != null) {
            progressDialog.dismiss();
            progressDialog = null;
        }
        if (delayHandler != null && jumpTask != null) {
            delayHandler.removeCallbacks(jumpTask);
        }
    }
}

说明

m1页面的现有逻辑无需修改,修复后的逻辑:

  1. 点击CardView后先弹出加载框,3秒延迟到后先销毁加载框再跳转至m1,避免Dialog残留
  2. 增加兜底逻辑:只要Meditation进入后台(包括跳转至m1、用户按桌面键退后台),都会自动销毁加载框、移除未执行的跳转任务,从m1返回时自然不会再看到残留的Dialog

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:36:03