Fragment 生命周期

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)破衔。

fragment生命周期.png

除了片段生命周期之外清女,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 上設置適配器 的合適位置脾歧。RecyclerViewViewPager2

片段和視圖已創(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()調用回調疙教。

片段和視圖已恢復

當片段可見時棺聊,所有 AnimatorTransition效果都已完成,并且片段已準備好進行用戶交互贞谓。片段 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() 回調世曾。此時,片段已達到其生命周期的終點谴咸。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末轮听,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子岭佳,更是在濱河造成了極大的恐慌血巍,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件珊随,死亡現(xiàn)場離奇詭異述寡,居然都是意外死亡,警方通過查閱死者的電腦和手機玫恳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門辨赐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人京办,你說我怎么就攤上這事掀序。” “怎么了惭婿?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵不恭,是天一觀的道長。 經常有香客問我财饥,道長换吧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任钥星,我火速辦了婚禮沾瓦,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己贯莺,他們只是感情好风喇,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缕探,像睡著了一般魂莫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上爹耗,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天耙考,我揣著相機與錄音,去河邊找鬼潭兽。 笑死倦始,一個胖子當著我的面吹牛,可吹牛的內容都是我干的讼溺。 我是一名探鬼主播楣号,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼怒坯!你這毒婦竟也來了?” 一聲冷哼從身側響起藻懒,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤剔猿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后嬉荆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體归敬,經...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年鄙早,在試婚紗的時候發(fā)現(xiàn)自己被綠了汪茧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡限番,死狀恐怖舱污,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情弥虐,我是刑警寧澤扩灯,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站霜瘪,受9級特大地震影響珠插,放射性物質發(fā)生泄漏。R本人自食惡果不足惜颖对,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一捻撑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦顾患、人聲如沸番捂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽白嘁。三九已至,卻和暖如春膘流,著一層夾襖步出監(jiān)牢的瞬間絮缅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工呼股, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留耕魄,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓彭谁,卻偏偏與公主長得像吸奴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子缠局,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內容