Support V4 Fragment

FragmentActivity繼承至Activity並進行了擴展以支持可以動態替換部分視圖的Fragment(碎片)特性,Fragment有本身的生命週期,當FragmentActivicty被回收時其下的全部Fragment都會被回收。數組

FragmentActivity內部經過FragmentManager的實現類FragmentManagerImpl的一個實例來管理其下的全部Fragment。動畫

Fragment 依附於FragmentActivity,根據FragmentManager 經過 FragmentTransaction 的add方法將Fragment和要對其進行的操做以BackStakRecord.Op對象鏈表的方式保持在BackStakRecord對象中,最後BackStakRecord調用FragmentManager .addFragment()等方法根據指定的viewId從Activity的viewtree中找到對應的ViewGroup實例,而後調用Fragment的onCreateView得到Fragment的視圖後加入到ViewGroup中,成爲當前視圖的一部分,其餘的detach、attach、replace過程與此相似。線程

FragmengManager 經過beginTransaction方法返回一個FragmentTransaction接口的實現類BackStackRecord實例,BackStackRecord類同時實現了Runnable方法但並不在獨立的線程中運行,全部的BackStackRecord都經過FragmengManager調用run()線性執行。對象

FragmentTransaction將持有FragmentManager的實例用以調用其方法進行交互,當調用FragmentTransaction->commit()提交事務時將調用FragmentManager->enqueueAction()並將本事務作爲參數傳入,FragmentManager經過mPendingActions一個數組保存全部要執行的事物,最後由FragmentActivity調用FragmentManager->execPendingActions()來線性執行全部的事務。繼承

BackStackRecord.add()調用doAddOp()方法將Fragment包裝爲BackStakRecord.Op對象,而後調用addOp(Op)方法使得Op.prev保持它的上一個Op對象的引用Op.next保持下一Op對象的引用,這樣就構成了一個Op鏈表BackStackRecord.mHead爲頭mTail爲尾,Op.cmd代表要對Fragment進行的操做(add,remove,detach,attach...),Op.fragment保持Fragment對象,Op.enterAnim爲Fragment進入動畫,Op.exitAnim爲退出動畫,Op.mPopEnterAnim爲Fragment從BackStack中還原時的進入動畫,Op.mPopExitAnim爲還原時的退出動畫。接口

調用BackStackRecord.commit()->commitInternal()提交事物,經過BackStackRecord->mManager->enqueueAction()方法將本事物加入到 FragmentManagerImpl->mPendingActions中,在FragmentActivity的onResume、onPostResume、onStart()方法中將調用FragmentManagerImpl->execPendingActions()方法來執行 FragmentManagerImpl->mPendingActions中的全部BackStackRecord->run()方法來對BackStackRecord中的全部Fragment進行指定的操做生命週期

相關文章
相關標籤/搜索