Fragment 生命周期
每個Fragment
實例都有自己的生命周期。當用戶導航并與您的應用程序交互時,您的片段會在其生命周期中的各種狀態(tài)中轉換罐寨,因為它們被添加、刪除以及進入或退出屏幕坟奥。
要管理生命周期,請Fragment
實現(xiàn) LifecycleOwner
拇厢、公開Lifecycle
您可以通過該 getLifecycle()
方法訪問的對象爱谁。
每個可能的Lifecycle
狀態(tài)都在 Lifecycle.State
枚舉中表示。
通過Fragment
在 之上構建Lifecycle
孝偎,您可以使用可用于 處理具有生命周期感知組件的生命周期的技術和類访敌。例如,您可以使用生命周期感知組件在屏幕上顯示設備的位置衣盾。該組件可以在片段變?yōu)榛顒訝顟B(tài)時自動開始偵聽捐顷,并在片段移動到非活動狀態(tài)時停止荡陷。
作為使用 的替代 方法LifecycleObserver
雨效, Fragment
該類包括對應于片段生命周期中的每個更改的回調方法迅涮。其中包括 onCreate()
、 onStart()
徽龟、 onResume()
叮姑、 onPause()
、 onStop()
和 onDestroy()
据悔。
片段的視圖具有Lifecycle
獨立于片段的Lifecycle
. 片段 LifecycleOwner
為其視圖維護 a 传透,可以使用 getViewLifecycleOwner()
或 訪問getViewLifecycleOwnerLiveData()
。訪問視圖Lifecycle
對于生命周期感知組件只應在片段視圖存在時執(zhí)行工作的情況很有用极颓,例如 LiveData
僅用于在屏幕上顯示的觀察朱盐。
本主題詳細討論Fragment
生命周期,解釋確定片段生命周期狀態(tài)的一些規(guī)則菠隆,并展示Lifecycle
狀態(tài)與片段生命周期回調之間的關系兵琳。
Fragment 和 Fragment 管理器
當一個片段被實例化時,它從INITIALIZED
狀態(tài)開始骇径。要讓片段在其生命周期的其余部分過渡躯肌,必須將其添加到 FragmentManager
. FragmentManager
負責確定其片段應該處于什么狀態(tài),然后將它們移動到該狀態(tài)破衔。
除了片段生命周期之外清女,FragmentManager
還負責將片段附加到其宿主活動并在片段不再使用時將其分離。該類Fragment
有兩個回調方法晰筛,onAttach()
和onDetach()
嫡丙,當這些事件中的任何一個發(fā)生時,您可以覆蓋它們以執(zhí)行工作读第。
當onAttach()
片段已添加到 a FragmentManager
并附加到其宿主活動時曙博,將調用回調。此時卦方,片段處于活動狀態(tài)羊瘩,并且FragmentManager
正在管理其生命周期狀態(tài)。此時盼砍,FragmentManager
諸如 findFragmentById()
返回此片段的方法尘吗。
onAttach()
總是在任何生命周期狀態(tài)更改之前調用。
當onDetach()
片段已從 a 中刪除FragmentManager
并與其宿主活動分離時浇坐,將調用回調睬捶。該片段不再處于活動狀態(tài),并且無法再使用 檢索 findFragmentById()
近刘。
onDetach()
在任何生命周期狀態(tài)更改后始終調用擒贸。
請注意臀晃,這些回調與 FragmentTransaction
方法 attach()
和 detach()
. 有關這些方法的更多信息,請參閱 片段事務介劫。
Fragment 生命周期狀態(tài)和回調
在確定片段的生命周期狀態(tài)時徽惋,FragmentManager
請考慮以下幾點:
- 片段的最大狀態(tài)由它的
FragmentManager
. 一個片段不能超越它的狀態(tài)FragmentManager
。 - 作為 的一部分
FragmentTransaction
座韵,您可以使用 為片段設置最大生命周期狀態(tài)setMaxLifecycle()
险绘。 - 片段的生命周期狀態(tài)永遠不能大于其父級。例如誉碴,父片段或活動必須在其子片段之前啟動宦棺。同樣,子片段必須在其父片段或活動之前停止黔帕。
向上狀態(tài)轉換
當通過其生命周期狀態(tài)向上移動時代咸,片段首先為其新狀態(tài)調用關聯(lián)的生命周期回調。一旦這個回調完成成黄,相關 Lifecycle.Event
的將由片段的 發(fā)送給觀察者Lifecycle
呐芥,然后是片段的視圖Lifecycle
,如果它已被實例化慨默。
片段已創(chuàng)建
當您的片段達到CREATED
狀態(tài)時贩耐,它已被添加到 aFragmentManager
并且該 onAttach()
方法已被調用。
這將是通過片段的 SavedStateRegistry
. 請注意厦取,此時 Fragment 的視圖尚未創(chuàng)建潮太,并且與 Fragment 的視圖關聯(lián)的任何狀態(tài)都應僅在視圖創(chuàng)建后才能恢復。
此轉換調用 onCreate()
回調虾攻≌÷颍回調還接收一個savedInstanceState
Bundle
參數(shù),其中包含以前保存的任何狀態(tài) onSaveInstanceState()
霎箍。請注意奇钞,第一次創(chuàng)建片段時它savedInstanceState
有一個null
值,但對于后續(xù)重新創(chuàng)建它始終為非空漂坏,即使您不覆蓋onSaveInstanceState()
景埃。有關更多詳細信息,請參閱 使用片段保存狀態(tài)顶别。
片段已創(chuàng)建并查看已初始化
Lifecycle
僅當您Fragment
提供有效View
實例時才會創(chuàng)建片段視圖谷徙。在大多數(shù)情況下,您可以使用 帶有 a的片段構造函數(shù)@LayoutId
驯绎,它會在適當?shù)臅r間自動膨脹視圖完慧。您還可以覆蓋 onCreateView()
以編程方式膨脹或創(chuàng)建片段的視圖。
當且僅當您的片段視圖使用非 null 實例化時 View
剩失,該View
值設置在片段上并且可以使用 getView()
. 然后 使用 與片段視圖對應getViewLifecycleOwnerLiveData()
的新內容進行更新 屈尼。INITIALIZED
LifecycleOwner
此時 onViewCreated()
也會調用生命周期回調册着。
這是設置視圖初始狀態(tài)、開始觀察其回調更新片段視圖的實例以及在片段視圖中的任何一個或多個 實例LiveData
上設置適配器 的合適位置脾歧。RecyclerView
ViewPager2
片段和視圖已創(chuàng)建
在片段的視圖被創(chuàng)建后甲捏,之前的視圖狀態(tài)(如果有的話)會被恢復,然后視圖的狀態(tài)Lifecycle
會被移動到該 CREATED
狀態(tài)中涨椒。視圖生命周期所有者也將 ON_CREATE
事件發(fā)送給它的觀察者摊鸡。在這里,您應該恢復與片段視圖關聯(lián)的任何其他狀態(tài)蚕冬。
此轉換還調用 onViewStateRestored()
回調。
片段和視圖開始
強烈建議將 生命周期感知組件綁定到STARTED
片段的狀態(tài)是辕,因為這種狀態(tài)保證片段的視圖是可用的(如果已創(chuàng)建)囤热,并且在片段FragmentTransaction
的子節(jié)點上執(zhí)行 a 是安全FragmentManager
的。如果片段的視圖不為空获三,則片段的視圖Lifecycle
會在片段移至 后STARTED
立即 Lifecycle
移至STARTED
旁蔼。
當片段變?yōu)?時STARTED
,將 onStart()
調用回調疙教。
片段和視圖已恢復
當片段可見時棺聊,所有 Animator
和 Transition
效果都已完成,并且片段已準備好進行用戶交互贞谓。片段 Lifecycle
移動到RESUMED
狀態(tài)限佩,并 onResume()
調用回調。
過渡到RESUMED
是指示用戶現(xiàn)在能夠與您的片段交互的適當信號裸弦。不RESUMED
應該手動設置其視圖的焦點或嘗試處理輸入法可見性的片段祟同。
向下狀態(tài)轉換
當片段向下移動到較低的生命周期狀態(tài)時,片段的視圖(如果已實例化)將相關Lifecycle.Event
信息發(fā)送給觀察者理疙,然后是片段的. 片段的生命周期事件發(fā)出后晕城,片段會調用關聯(lián)的生命周期回調。Lifecycle``Lifecycle
片段和視圖開始
當用戶開始離開片段時窖贤,當片段仍然可見時砖顷,Lifecycle
片段及其視圖的 s 將移回STARTED
狀態(tài)并將 ON_PAUSE
事件發(fā)送給觀察者。然后片段調用它的 onPause()
回調赃梧。
片段和視圖已創(chuàng)建
一旦片段不再可見滤蝠,Lifecycle
片段及其視圖的 s 將移動到CREATED
狀態(tài)并將 ON_STOP
事件發(fā)送給它們的觀察者。這種狀態(tài)轉換不僅由停止的父活動或片段觸發(fā)槽奕,而且由父活動或片段保存狀態(tài)觸發(fā)几睛。此行為保證在ON_STOP
保存片段狀態(tài)之前調用事件。這使得事件成為可以安全地對 childON_STOP
執(zhí)行 a 的最后一點 粤攒。FragmentTransaction``FragmentManager
片段已創(chuàng)建所森,視圖已銷毀
在所有的退出 動畫和轉換完成后囱持,片段的視圖已經從窗口中分離出來,片段的視圖Lifecycle
被移動到DESTROYED
狀態(tài)并將ON_DESTROY
事件發(fā)送給它的觀察者焕济。然后片段調用它的 onDestroyView()
回調纷妆。此時,fragment 的視圖已到達其生命周期的末尾并 getViewLifecycleOwnerLiveData()
返回一個null
值晴弃。
此時掩幢,所有對片段視圖的引用都應該被刪除,從而允許對片段視圖進行垃圾回收上鞠。
片段被破壞
如果 Fragment 被移除际邻,或者 FragmentFragmentManager
被銷毀,則 FragmentLifecycle
將進入DESTROYED
狀態(tài)并將 ON_DESTROY
事件發(fā)送給它的觀察者芍阎。然后片段調用它的 onDestroy()
回調世曾。此時,片段已達到其生命周期的終點谴咸。