public Fragment instantiate(@NonNull ClassLoader classLoader, @NonNull FragmentFactory factory){ if (mInstance == null) { if (mArguments != null) { mArguments.setClassLoader(classLoader); } mInstance = factory.instantiate(classLoader, mClassName); mInstance.setArguments(mArguments); // fragment唯一恢复数据的操作 if (mSavedFragmentState != null) { mSavedFragmentState.setClassLoader(classLoader); mInstance.mSavedFragmentState = mSavedFragmentState; } else { // When restoring a Fragment, always ensure we have a // non-null Bundle so that developers have a signal for // when the Fragment is being restored mInstance.mSavedFragmentState = new Bundle(); } mInstance.mWho = mWho; mInstance.mFromLayout = mFromLayout; mInstance.mRestored = true; mInstance.mFragmentId = mFragmentId; mInstance.mContainerId = mContainerId; mInstance.mTag = mTag; mInstance.mRetainInstance = mRetainInstance; mInstance.mRemoving = mRemoving; mInstance.mDetached = mDetached; mInstance.mHidden = mHidden; mInstance.mMaxState = Lifecycle.State.values()[mMaxLifecycleState]; if (FragmentManagerImpl.DEBUG) { Log.v(FragmentManagerImpl.TAG, "Instantiated fragment " + mInstance); } } return mInstance; }
voidrestoreSaveState(@Nullable Parcelable state){ // If there is no saved state at all, then there's nothing else to do if (state == null) return; FragmentManagerState fms = (FragmentManagerState) state; if (fms.mActive == null) return;
// Build the full list of active fragments, instantiating them from // their saved state. mFragmentStore.resetActiveFragments(); for (FragmentState fs : fms.mActive) { if (fs != null) { FragmentStateManager fragmentStateManager; Fragment retainedFragment = mNonConfig.findRetainedFragmentByWho(fs.mWho); if (retainedFragment != null) { if (isLoggingEnabled(Log.VERBOSE)) { Log.v(TAG, "restoreSaveState: re-attaching retained " + retainedFragment); } // fragmentStateManager = new FragmentStateManager(mLifecycleCallbacksDispatcher, retainedFragment, fs); } else { // 在这重新创建了Fragment fragmentStateManager = new FragmentStateManager(mLifecycleCallbacksDispatcher, mHost.getContext().getClassLoader(), getFragmentFactory(), fs); } Fragment f = fragmentStateManager.getFragment(); f.mFragmentManager = this; if (isLoggingEnabled(Log.VERBOSE)) { Log.v(TAG, "restoreSaveState: active (" + f.mWho + "): " + f); } fragmentStateManager.restoreState(mHost.getContext().getClassLoader()); mFragmentStore.makeActive(fragmentStateManager); // Catch the FragmentStateManager up to our current state // In almost all cases, this is Fragment.INITIALIZING, but just in // case a FragmentController does something...unique, let's do this anyways. fragmentStateManager.setFragmentManagerState(mCurState); } }