Fragment生命周期


序言
Fragment從Android v3.0版本開始引入的,隨着界面布局的復雜化,處理起來也更加的復雜,引入Fragment可以把Activity拆分成多個部分。一個Activity可以同時組合多個Fragment,一個Fragment也可被多個Activity 復用。Fragment可以響應自己的輸入事件,並擁有自己的生命周期,但它們的生命周期直接被其所屬的Activity的生命周期控制。
Fragment生命周期流程圖
正文
1. 生命周期簡介
Fragment必須是依存與Activity而存在的,因此Activity的生命周期會直接影響到Fragment的生命周期。Fragment狀態與Activity類似,也存在如下4種狀態:
  • 運行:當前Fmgment位於前台,用戶可見,可以獲得焦點。
  • 暫停:其他Activity位於前台,該Fragment依然可見,只是不能獲得焦點。
  • 停止:該Fragment不可見,失去焦點。
  • 銷毀:該Fragment被完全刪除,或該Fragment所在的Activity被結束。
2. 生命周期狀態
Fragment的生命周期與Activity的生命周期十分相似,如下圖所示:
Activity和Fragment生命周期對比流程圖
從上圖可以看出,Activity中的生命周期方法,Fragment中基本都有,但是Fragment比Activity多幾個方法。各生命周期方法的含義如下:
  • onAttach() :
當Fragment與Activity發生關聯時調用。
  • onCreate():
創建Fragment時被回調。
  • onCreateView():
每次創建、繪制該Fragment的View組件時回調該方法,Fragment將會顯示該方法返回的View 組件。
  • onActivityCreated():
當 Fragment 所在的Activity被啟動完成后回調該方法。
  • onStart():
啟動 Fragment 時被回調,此時Fragment可見。
  • onResume():
恢復 Fragment 時被回調,獲取焦點時回調。
  • onPause():
暫停 Fragment 時被回調,失去焦點時回調。
  • onStop():
停止 Fragment 時被回調,Fragment不可見時回調。
  • onDestroyView():
銷毀與Fragment有關的視圖,但未與Activity解除綁定。
  • onDestroy():
銷毀 Fragment 時被回調。
  • onDetach():
與onAttach相對應,當Fragment與Activity關聯被取消時調用。
3. 生命周期調用
1)創建Fragment
onAttach() —> onCreate() —> onCreateView() —> onActivityCreated() —> onStart() —> onResume()
2)按下Home鍵回到桌面 / 鎖屏
onPause() —> onStop()
3)從桌面回到Fragment / 解鎖
onStart() —> onResume()
4)切換到其他Fragment
onPause() —> onStop() —> onDestroyView()
5)切換回本身的Fragment
onCreateView() —> onActivityCreated() —> onStart() —> onResume()
6) 按下Back鍵退出
onPause() —> onStop() —> onDestroyView() —> onDestroy() —> onDetach()
參考
結語
至此,Fragment的生命周期介紹完畢。Fragment具有與Activity很相似的生命周期,依存與Activity而存在的,因此Activity的生命周期會直接影響到Fragment的生命周期。
 
源碼注釋
 
onAttach
當 fragment 首次附加到其上下文時調用。之后將調用onCreate(Bundle)。
 
onCreate
調用它來進行 fragment 的初始創建。這是在onAttach(Context)之后和onCreateView(LayoutInflater, ViewGroup, Bundle)之前調用的。
 
請注意,這可以在 fragment 的 activity 仍然處於創建過程中時調用。因此,此時您不能依賴於正在初始化的活動的內容視圖層次結構之類的東西。如果你想在 activity 本身被創建后立即執行工作,請查看 onActivityCreated(Bundle)。
 
任何恢復的子 fragments 都將在 base Fragment.onCreat 方法返回之前創建。
 
onCreateView
調用此函數以使 fragment 實例化其用戶界面視圖。這是可選的,非圖形化片段可以返回null。這將在onCreate(Bundle)和onActivityCreated(Bundle)之間調用。
 
在構造函數中調用Fragment(int)可以返回默認視圖。否則,此方法返回null。
 
建議只在此方法中擴展布局,並將操作返回視圖的邏輯移動到onViewCreated(View, Bundle)。
 
如果你從這里返回一個視圖,當視圖被釋放時,你將在onDestroyView中被調用。
 
參數:
擴展器——LayoutInflater對象,可用於擴展片段中的任何視圖,
容器——如果非空,這是片段的UI應該附加到的父視圖。片段不應該添加視圖本身,但是這可以用來生成視圖的LayoutParams。
savedInstanceState—如果非空,則此片段將按照這里給出的方式,從先前保存的狀態重新構造。
返回:
返回片段UI的視圖,或null。
 
onActivityCreate
在 fragment 的 activity 被創建完成並且實例化了該 fragment 的視圖層次結構時調用。一旦這些部分就位,就可以使用它進行最后的初始化,例如檢索視圖或恢復狀態。對於使用setRetainInstance(布爾值)來保留它們的實例的片段也很有用,因為這個回調會在片段與新的活動實例完全關聯時告訴它。這是在onCreateView之后和onViewStateRestored(Bundle)之前調用的。
 
參數:
savedInstanceState—如果片段是從以前保存的狀態重新創建的,那么這就是狀態。
 
onViewStateRestored
當保存的所有狀態都恢復到片段的視圖層次結構中時調用。這可以用於根據保存的視圖層次結構跟蹤自身的狀態(比如當前是否選中復選框小部件)進行初始化。這是在onActivityCreated(Bundle)之后和onStart()之前調用的。
 
參數:
savedInstanceState—如果片段是從以前保存的狀態重新創建的,那么這就是狀態。
 
onStart
當 fragment 對用戶可見時調用。這通常與作為容器的Activity的生命周期 的Activity.onStart 方法相關聯。
在 Activity.onStart 方法之前回調。
 
onResume
當 fragment 對用戶可見並正在運行時調用。這通常與作為容器的Activity的生命周期 的Activity.onResume 方法相關聯。
在 Activity.onResume 方法之后回調。
 
onPause
Called when the Fragment is no longer resumed. This is generally tied to Activity.onPause of the containing Activity's lifecycle.
當片段不再恢復時調用。這通常與作為容器的Activity的生命周期 的Activity.onPause 方法相關聯。
在 Activity.onPause 方法之前回調。
 
onSaveInstanceState
調用此函數以要求 fragment 保存其當前動態狀態,以便稍后可以在其流程的新實例中重新啟動它。如果稍后需要創建片段的新實例,那么您放置在此包中的數據將在提供給onCreate(Bundle)、onCreateView(LayoutInflater、ViewGroup、Bundle)和onActivityCreated(Bundle)的 Bundle 中可用。
 
這對應於Activity.onSaveInstanceState(Bundle),這里的大部分討論也適用於這里。但是注意:這個方法可以在onDestroy()之前的任何時候調用。在很多情況下,一個片段可能會被撕下來(例如當它被放在后台堆棧上而沒有UI顯示時),但是它的狀態將不會被保存,直到它所擁有的 Activity 實際上需要保存它的狀態。
 
參數:
outState—將保存的狀態放置在其中的Bundle。
 
onStop
Called when the Fragment is no longer started. This is generally tied to Activity.onStop of the containing Activity's lifecycle.
當片段不再啟動時調用。這通常與作為容器的Activity的生命周期 的Activity.onStop 方法相關聯。
在 Activity.onStop 方法之前回調。
 
onDestroyView
當先前由onCreateView創建的視圖與 fragment 分離時調用。下一次需要顯示片段時,將創建一個新視圖。這是在onStop()之后和onDestroy()之前調用的。不管onCreateView是否返回非空視圖,它都會被調用。在內部,它在視圖的狀態被保存后調用,但在從其父視圖中刪除之前調用。
 
onDestroy
當片段不再使用時調用。這是在onStop()之后和onDetach()之前調用的。
 
onDetach
當 fragment 不再附加到其 Activity 時調用。這在onDestroy()之后調用。
 
git地址:https://github.com/First-Time/LifeCycleDemo.git


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM