这个异常可能在多种情况下抛出。
一、commit()
最典型的是使用commit()方法会遇到该异常,我们先看下图具体实现源码:
可以看到,如果allowStateLoss为false,则检测状态丢失,此时如果mStateSaved为true,就会抛出异常。所以当我们调用commitAllowingStateLoss()方法,则传入的allowStateLoss值为真,就不会调用checkStateLoss()方法,也就不会抛出异常了。
二、stop()后的checkStateLoss()抛出异常
你可能已经发现mStateSaved状态是抛出异常的关键,只有其为真,那么调用checkStateLoss()必定抛出异常。那么什么时候mStateSaved被置为真的呢?我们看下源码:
可以看到当Fragment进入stop状态时,mStateSaved为真。此时如果执行退出方法onBackPressed()则必定抛出异常。我们看下FragmentActivity的onBackPressed()方法逻辑:
可见,在popBackStackImmediate()方法中首先进行了状态丢失检测,如果mStateSaved为真则必定抛出此异常。
我们对FragmentActivity的onBackPressed()要进行状态丢失检测可能是出于状态完整性考虑,但为避免异常,可覆盖onBackPressed()方法,直接finish()。