直接把手机的 不保留后台进程功能打开,然后再调试模式运行app 显示一个Fragment,直接按home键,点击app图标再次打开App。
同时断点在Activity的onCreate方法上,不断往里走,直到FragmentActivity的onCreate方法里,可以看到下面
if (savedInstanceState != null) {
Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
mFragments.restoreAllState(p, nc != null ? nc.fragments : null);
继续看mFragments.restoreAllState,依次看到以下代码段
mInstance = container.instantiate(context, mClassName, mArguments);
} else {
mInstance = Fragment.instantiate(context, mClassName, mArguments);
}
Class<?> clazz = sClassMap.get(fname);
if (clazz == null) {
// Class not found in the cache, see if it's real, and try to add it
clazz = context.getClassLoader().loadClass(fname);
sClassMap.put(fname, clazz);
}
Fragment f = (Fragment) clazz.getConstructor().newInstance();
if (args != null) {
args.setClassLoader(f.getClass().getClassLoader());
f.setArguments(args);
}
return f;
} catch (ClassNotFoundException e) {
最终把需要恢复的Fragment通过无参数构造方法实例化,装到FragmentManager的mActive中去,接着装入到mAdded中。这里可以知道在Activity恢复时会走onCreate方法,并且在这个方法里把需要恢复的Fragment创建出来放在Fragmentmanager实体类中。
然后把断点打在Fragment的onViewCreated方法中,通过调用栈可以看到
@Override
protected void onStart() {
super.onStart();
mStopped = false;
if (!mCreated) {
mCreated = true;
mFragments.dispatchActivityCreated();
}
mFragments.noteStateNotSaved();
mFragments.execPendingActions();
// NOTE: HC onStart goes here.
mFragments.dispatchStart();
}
Fragment的onViewCreated方法是在FragmentActivity的onStart里的super.onStart()之后调用的。
网友评论