Fragment源码

以6.0代码

ActivityThread.performLaunchActivity-> // 经过反射初始化Activity,Activity new出来后会同时实例化他的全局变
                         // 量,mFragments,这个对象实际是FragmentController,这里主要
                        // 把Activity内部类,HostCallbacks保持下来
FragmentController.mHost = HostCallbacks

Activity.mFragments.attachHost   // 这一步会mFragmentManager(FragmentManagerImpl)与HostCallbacks
                    // 关联起来,创建Activity与mFragmentManager的关系经过handler


ActivityThread.callActivityOnCreate->
自定义Activity.onCreate-> super.onCreate //源码Activity

FragmentManagerImpl.dispatchCreate->  //第一次只是改变mCurState为CREATED、

自定义Activity.onCreate->
getFragmentManager->  // 返回FragmentManagerImpl

  FragmentManagerImpl.beginTransaction  //获得BackStackRecord

  BackStackRecord.replace -> doAddOp  //Op双向链表,将Fragment加入这个双向链表中

  BackStackRecord.commit ->  // 提交事务,主要是经过Activity的handler发送到主线程消息队列等候处理

FragmentManagerImpl.execPendingActions // 遍历BackStackRecord的run方法,而后遍历Op(既Fragment)
                                         // FragmentManagerImpl.addFragment(将Fragment加进去)

FragmentManagerImpl.addFragment // 初始化 mActive(存放活动的Fragment)
FragmentManagerImpl.moveToState // 开始执行Fragment的生命周期了
                   // attach-> oncreate->oncreateView -> onActivityCreated

Activity.performCreateCommon -> // 第二次 dispatchActivityCreated(与上边的第一次相呼应,一个是经过
                                // Activity的onCreate调用,一个是performCreateCommon调用)

FragmentManagerImpl.moveToState

总结:markdown

BackStackRecord: 经过add(Fragmen)或replace维护一个Fragment的Op,由于它实现了Runable接口,因此经过自身run分发到FragmentManagerImpl。spa

FragmentManagerImpl:进行Fragment生命周期的分发在moveToState方法线程

activity 经过HostCallbacks 与FragmentManagerImpl创建联系code

相关文章
相关标签/搜索