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
相关产品推荐
相关产品推荐

