http://wiki.jikexueyuan.com/project/notes/images/FullFragmentAndActivityLifeCycle.png" alt="FullFragmentAndActivityLifeCycle.png" />
setRetainInstance()方法,讓Fragment在應(yīng)用程序配置發(fā)生變化(橫豎屏、屏幕尺寸)時,不會被destroy,從而繼續(xù)執(zhí)行后臺任務(wù);java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1341)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1352)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)
如何避免
Be careful when committing transactions inside Activity lifecycle methods
只在onCreate或者響應(yīng)用戶的輸入時才會commit,不會遇到這個問題;但如果在onActivityResult、onStart、onResume等其他生命周期函數(shù)中調(diào)用,則會有風(fēng)險,尤其是onResume,推薦使用FragmentActivity#onResumeFragments()/Activity#onPostResume()中調(diào)用,而不是onResume。
private boolean mReturningWithResult = false;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
mReturningWithResult = true;
}
@Override
protected void onPostResume() {
super.onPostResume();
if (mReturningWithResult) {
// Commit your transactions here.
}
// Reset the boolean flag back to false for next time.
mReturningWithResult = false;
}