以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
总结:
BackStackRecord: 通过add(Fragmen)或replace维护一个Fragment的Op,因为它实现了Runable接口,所以通过自身run分发到FragmentManagerImpl。
FragmentManagerImpl:进行Fragment生命周期的分发在moveToState方法
activity 通过HostCallbacks 与FragmentManagerImpl建立联系