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

Android Activity调用recreate后OnResume后触发OnPause及异常问题

问题原因分析

该异常是recreate()调用时机错误导致的Activity生命周期状态错乱,具体根因如下:

  • Android系统中Activity的onResume回调执行过程中,Activity还未被系统标记为**已恢复(resumed)**状态,只有当onResume整个执行完毕后,才会完成状态标记。
  • 你在onResume内直接调用recreate()时,系统会立刻触发旧Activity实例的销毁流程:首先要求旧实例执行onPause,但此时旧实例还没有完成resume状态标记,系统在执行pause逻辑时检测到状态不匹配,就会抛出Performing pause of activity that is not resumed错误。
  • 你看到的第二次异常onPause,是系统销毁旧实例的残留任务投递,本质还是新旧实例的生命周期时序冲突导致的。
解决方案

不要在onResume回调的同步流程里直接调用recreate(),可以选择以下两种修复方案:

方案1:将调用时机移到onPostResume

onPostResume是系统在Activity完全进入resumed状态后才会触发的回调,此时调用recreate()不会出现状态冲突:

@Override
protected void onPostResume() {
    super.onPostResume();
    if(from_B) {
        from_B = false;
        recreate();
    }
}

方案2:用主线程Handler延迟投递recreate任务

将recreate()放到主线程消息队列末尾,等当前onResume执行完毕、Activity状态更新完成后再执行:

@Override
protected void onResume() {
    super.onResume();
    if(from_B) {
        from_B = false;
        new Handler(Looper.getMainLooper()).post(() -> recreate());
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 08:39:05