Fragment中的mHost

在文章Fragment事务提交源码分析文章中,我们了解到Fragment提交事物的时候是由handler中决定的,不过在那篇文章中我们是通过获取Activity中的FragmentManager对象来分析的,那么在Fragment嵌套的时候,我们需要获取的childFragmentManager中的事务是由什么来控制的呢?

Fragment中核心类获取

我们在Fragment可以获取两种FragmentManager,根据场景的不同,我们可以获取不同的FragmentManager
下面我们来看看两种FM的获取代码。

final public FragmentManager getFragmentManager() {
    return mFragmentManager;
}
//在某处初始化方法中,mInstance是Fragment的一个实例
mInstance.mFragmentManager = host.mFragmentManager;

可以看到,Fragment中,getFragmentManager()获取的对象实际上是由host提供的,而此处的host是FragmentActivity对象,所以getFragmentManager()实际上就是Fragment所在的host持有的FragmentManager对象

final public FragmentManager getChildFragmentManager() {
    if (mChildFragmentManager == null) {
        instantiateChildFragmentManager();
        if (mState >= RESUMED) {
            mChildFragmentManager.dispatchResume();
        } else if (mState >= STARTED) {
            mChildFragmentManager.dispatchStart();
        } else if (mState >= ACTIVITY_CREATED) {
            mChildFragmentManager.dispatchActivityCreated();
        } else if (mState >= CREATED) {
            mChildFragmentManager.dispatchCreate();
        }
    }
    return mChildFragmentManager;
}
void instantiateChildFragmentManager() {
    mChildFragmentManager = new FragmentManagerImpl();
    //传入了mHost对象到FragmentManager中
    mChildFragmentManager.attachController(mHost, new FragmentContainer() {
        @Override
        @Nullable
        public View onFindViewById(int id) {
            if (mView == null) {
                throw new IllegalStateException("Fragment does not have a view");
            }
            return mView.findViewById(id);
        }
        @Override
        public boolean onHasView() {
            return (mView != null);
        }
}, this);
//而mHost的赋值是在Fragment初始化的时候由FragmentManager执行的。是把Fragment中的mHost赋值给Fragment的mHost.

所以,childFragmentManager中的mHostfragmentManager中的host都是同一个对象。
为了验证,以上分析的正确性,我在两层嵌套的Fragment都打印了host对象,解果两个host为同一个对象,所以不管是使用Activity还是Fragment进行事物提交,最终都是由同一个handler进行事件分发的