从FragmentActivity开始分析:
在FragmentActivity中有一个FragmentController对象mFragments,该对象的创建和初始化如下:
final FragmentController mFragments = FragmentController.createController(new HostCallbacks());
1.HostCallbacks的初始化
new HostCallbacks()的操作其实很简单,HostCallbacks是FragmentActivity的内部类,是继承自FragmentHostCallback的,而new HostCallbacks最终是调用到了FragmentHostCallback的构造器。FragmentHostCallback的构造器其实就是保存了相应的上下文对象,创建了Handler,该Handler是用来进行异步提交处理Runnable任务的。
FragmentHostCallback(@Nullable Activity activity, @NonNull Context context,
@NonNull Handler handler, int windowAnimations) {
mActivity = activity;
mContext = Preconditions.checkNotNull(context, "context == null");
mHandler = Preconditions.checkNotNull(handler, "handler == null");
// mWindowAnimations其实是等于0
mWindowAnimations = windowAnimations;
}
在创建HostCallbacks对象的时候,其父类FragmentHostCallback又会创建一个FragmentManager对象mFragmentManager,其实现类是FragmentManagerImpl。
2.FragmentController#createController
FragmentController的对象创建其实很简单,其构造器是私有的,所有通过静态方法创建。
public static FragmentController createController(@NonNull FragmentHostCallback> callbacks) {
return new FragmentController(checkNotNull(callbacks, "callbacks == null"));
}
3.FragmentActivity#onCreate
FragmentActivity作为Activity的生命周期开始位置,则也会通过mFragments这个FragmentController对象进行生命周期的分发,然后执行Fragment的生命周期
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
mFragments.attachHost(null /*parent*/);
// 这里是状态恢复的情况下才会执行
if (savedInstanceState != null) {
// 从内存中取出状态保存是保存的数据
Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
mFragments.restoreSaveState(p);
// Check if there are any pending onActivityResult calls to descendent Fragments.
if (savedInstanceState.containsKey(NEXT_CANDIDATE_REQUEST_INDEX_TAG)) {
mNextCandidateRequestIndex =
savedInstanceState.getInt(NEXT_CANDIDATE_REQUEST_INDEX_TAG);
int[] requestCodes = savedInstanceState.getIntArray(ALLOCATED_REQUEST_INDICIES_TAG);
String[] fragmentWhos = savedInstanceState.getStringArray(REQUEST_FRAGMENT_WHO_TAG);
if (requestCodes == null || fragmentWhos == null ||
requestCodes.length != fragmentWhos.length) {
Log.w(TAG, "Invalid requestCode mapping in savedInstanceState.");
} else {
mPendingFragmentActivityResults = new SparseArrayCompat<>(requestCodes.length);
for (int i = 0; i < requestCodes.length; i++) {
mPendingFragmentActivityResults.put(requestCodes[i], fragmentWhos[i]);
}
}
}
}
if (mPendingFragmentActivityResults == null) {
mPendingFragmentActivityResults = new SparseArrayCompat<>();
mNextCandidateRequestIndex = 0;
}
super.onCreate(savedInstanceState);
mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
// 向FragmentController分发生命周期事件
mFragments.dispatchCreate();
}
4.FragmentController#attachHost
public void attachHost(@Nullable Fragment parent) {
// 这里的mHost是FragmentHostCallback的子类对象,mFragmentManager
// 是FragmentManager对象,其实现类是FragmentManagerImpl
// 这里会初始化FragmentManager中的mContainer容器对象,该勇气是在Fragment创建
// ContentView的时候使用的,因为该
mHost.mFragmentManager.attachController(
mHost, mHost /*container*/, parent);
}
5.FragmentManager#attachController
这里其实就是做一定的数据绑定,把对应的Fragment、还有HostCallbacks等于FragmentManager做绑定,不过这里的mParent是为null的。因为在FragmentActivity传入的时候就是传的null
void attachController(@NonNull FragmentHostCallback> host,
@NonNull FragmentContainer container, @Nullable final Fragment parent) {
if (mHost != null) throw new IllegalStateException("Already attached");
mHost = host;
mContainer = container;
mParent = parent;
if (mParent != null) {
// 这里取决于是否依赖有导航的Fragment
updateOnBackPressedCallbackEnabled();
}
// 设置点击backPressed的回调
if (host instanceof OnBackPressedDispatcherOwner) {
OnBackPressedDispatcherOwner dispatcherOwner = ((OnBackPressedDispatcherOwner) host);
mOnBackPressedDispatcher = dispatcherOwner.getOnBackPressedDispatcher();
LifecycleOwner owner = parent != null ? parent : dispatcherOwner;
mOnBackPressedDispatcher.addCallback(owner, mOnBackPressedCallback);
}
// 获取对应的FragmentManager的视图模型
if (parent != null) {
mNonConfig = parent.mFragmentManager.getChildNonConfig(parent);
} else if (host instanceof ViewModelStoreOwner) {
ViewModelStore viewModelStore = ((ViewModelStoreOwner) host).getViewModelStore();
mNonConfig = FragmentManagerViewModel.getInstance(viewModelStore);
} else {
mNonConfig = new FragmentManagerViewModel(false);
}
}
6.FragmentController#dispatchCreate
FragmentController中的很多操作,其实都是通过HostCallbacks中的mFragmentManager对象,调用到FragmentManager或者FragmentManagerImpl中对应的方法。
publ