Fragment生命周期流程圖
? ? ? ? Fragment是Android的視圖生命周期控制器,與Activity相比,它只占用更少的資源酱虎,并且提供更大的靈活性,兼容性等擂涛。即使是在性能較差的平臺上也能十分流暢的運(yùn)行读串,并且能將過渡動畫兼容到更低的版本。
????????現(xiàn)在的Fragment的功能已經(jīng)很強(qiáng)大了撒妈,足以在很多場合替代Activity的存在恢暖,安卓大神級開發(fā)者JakeWharton曾經(jīng)說過,一個App只需要一個Activity狰右,說的就是單Activity多Fragment模式杰捂。
一些有用的回調(diào)函數(shù),以及他們發(fā)生的時機(jī)
? ? ? ? 看到上面那張圖你可能都煩了棋蚌,不過其實(shí)不需要全部掌握嫁佳,了解部分即可挨队。
????????Activity因?yàn)楸容^簡單且網(wǎng)上的資料頗多我就不展開講了,而Fragment就比較操蛋蒿往,這里介紹一些Fragment的的回調(diào)函數(shù):
? ? ? ? 1.onInflate(Context,AttributeSet,Bundle)只有硬編碼在xml中的Fragment(即使用fragment標(biāo)簽)才會調(diào)用該方法盛垦,與自定義View十分類似,在實(shí)例化Xml布局時該方法會被調(diào)用
? ? ? ? 2.onAttach(Context):執(zhí)行該方法時瓤漏,F(xiàn)ragment與Activity已經(jīng)完成綁定情臭,該方法傳入一個Context對象,實(shí)際上就是該Fragment依附的Activity赌蔑,此時調(diào)用getActivity將不會返回null俯在,但是Activity#onCreate可能還有沒有執(zhí)行。
? ? ? ? 3.onCreate(Bundle):用來初始化Fragment娃惯□卫郑可通過參數(shù)savedInstanceState獲取之前保存的值。
? ? ? ? 4.onCreateView(LayoutInflater,ViewGroup,Bundle):需要返回一個View用來初始化Fragment的布局趾浅。默認(rèn)返回null愕提,值得注意的是,若返回null Fragment#onViewCreated將不會執(zhí)行皿哨。使用ViewPager+Fragment時此方法可能會被多次調(diào)用浅侨。
? ? ? ? 5.onActivityCreated(Bundle):執(zhí)行該方法時,與Fragment綁定的Activity的onCreate方法已經(jīng)執(zhí)行完成并返回证膨,若在此之前與Activity交互如输,若引用了未初始化的資源會應(yīng)發(fā)控制在異常。
? ? ? ? 6.onStart():執(zhí)行該方法時央勒,F(xiàn)ragment由不可見變?yōu)榭梢姞顟B(tài)不见。
? ? ? ? 7.onResume():執(zhí)行該方法時,F(xiàn)ragment處于活動狀態(tài)崔步,用戶可與之交互稳吮。
? ? ? ? 8.onPause():執(zhí)行該方法時,F(xiàn)ragment處于暫停狀態(tài)井濒,但依然可見灶似,用戶不能與之交互。
? ? ? ? 9.onSaveInstanceState(Bundle):保存當(dāng)前Fragment的狀態(tài)瑞你。該方法會自動保存Fragment的狀態(tài)酪惭,比如EditText鍵入的文本,即使Fragment被回收又重新創(chuàng)建捏悬,一樣能恢復(fù)EditText之前鍵入的文本撞蚕。
????????10.onStop():執(zhí)行該方法時润梯,F(xiàn)ragment完全不可見过牙。
? ? ? ? 11.onDestroyView():銷毀與Fragment有關(guān)的視圖甥厦,但未與Activity解除綁定,一般在這個回調(diào)里解除Fragment對視圖的引用寇钉。通常在ViewPager+Fragment的方式下會調(diào)用此方法刀疙,并且與Fragment#onCreateView一樣可能是多次的。
? ? ? ? 12.onDestroy():銷毀Fragment扫倡。通常按Back鍵退出或者Fragment被回收時調(diào)用此方法谦秧,此時應(yīng)該清理Fragment中所管理的所有數(shù)據(jù)。
? ? ? ? 13.onDetach():解除與Activity的綁定撵溃。在onDestroy方法之后調(diào)用疚鲤。若在此時getActivity,你將會得到一個null缘挑。
????????Fragment其實(shí)就是一個帶了生命周期的自定義ViewGroup集歇,由于有些場景跟生命周期密切相關(guān),可以使用Fragment语淘。但如果與生命周期相關(guān)程度不大诲宇,那么還是推薦使用自定義View來完成這部分工作,因?yàn)镕ragment還是比較重量級的惶翻,所有FragmentTransaction(碎片事務(wù))都是異步執(zhí)行的姑蓝,雖然他會保證在下一次VSYNC(下一幀渲染)前調(diào)用,但是還是會造成有一段時間你的UI不在你的控制之內(nèi)吕粗。
????????當(dāng)然纺荧,有限的控制手段當(dāng)然存在的,當(dāng)在提交碎片事務(wù)的時候還是允許你對他進(jìn)行一些控制颅筋,你可以嘗試使用FragmentTransaction#runOnCommit虐秋。