我对此进行了充分的研究,没有一个明确的解决方案。
在生命周期中,尤其是在Fragment生命周期中,在onPause()之后的任何时刻都会出现Exception。
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
我的逻辑说,要继续当前的片段,当它到达此状态后,我必须重新启动活动,并使用Intent再次指向想要的片段。
我想弄清楚正在发生的事情以及应对它的真正解决方案。
我需要了解这种机制的优缺点;在片段或活动生命周期中的重要性。
此外,如果我将onCreate中的Windows功能更改为不进入睡眠状态,除非用户手动按了“主页”按钮,否则活动仍将进入此状态吗?
答案 0 :(得分:3)
当您试图在Fragment
内的Activity
暂停时以任何其他方式添加/删除/替换/交互时,会发生此异常。
这意味着Activity
如果立即被销毁,将无法恢复其状态(恢复已更改的Fragment的状态)。
此处的最佳解决方案是在与Fragment交互期间检查Activity是否不暂停。
另一种选择是使用commitAllowingStateLoss()
与Fragment事务进行交互,但可能会丢失其状态。
在理想环境中,您应该仔细分析每个崩溃,并添加检查以验证是否只有在Activity
启动并运行时才与片段进行交互。
答案 1 :(得分:1)
在新的Android开发人员参考和使用JetPack生命周期监听器的指南文档中提供了更好的解释。
https://developer.android.com/topic/libraries/architecture/lifecycle#kotlin
该库使组件知道活动生命周期。这意味着您不需要覆盖每个生命周期回调的抽象baseActivity类,并将该状态记录在布尔变量中。 LifeCycle侦听器将为您做到这一点。
所有您需要做的就是停止引入新的片段,或者停止在响应返回时更新UI的所有Loader。正确的时间是在调用onStop或onSavedInstance状态之前,您的组件将被意识到。
它清楚地表明,在调用onSavedInstancState或onStop之后,UI变为不可变的,直到再次调用Activity的onStart为止。有时,当此状态发生并且没有机会调用onStart时,您必须使用intent使用NEW TASK和CLEAR TASK标志调用重新启动同一活动。
快乐编码:-)