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

相關文章
相關標籤/搜索