以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