Fragment的生命週期
轉自Focus100 面試專題之一Fragment的生命週期
面試的時候,如果被面試官問到Fragment的生命週期,想必大家直接脫口而出:onCreate()
、onCreateView()
、onActivityCreated()
、on……
,然後就沒有然後了。學習生命週期不是為了應付面試,背個執行順序就完了,要理解每個方法的含義,而它們的真正含義,只有通過不斷做實驗,把每種情況都實驗一遍才能得出答案,過程是漫長又繁瑣的。下面的結果就是博主不斷實驗的結果,當然大家不要看完就完了,要自已去實驗,親身去體會,別人的東西並不是自已的東西,我的答案不一定就是完全正確的,大家要清楚這一點,同時如有錯誤望大家批評指正。
Fragment每個生命週期方法的意義、作用(注意紅色的不是生命週期方法):
setUserVisibleHint()
:設定Fragment可見或者不可見時會呼叫此方法。在該方法裡面可以通過呼叫getUserVisibleHint()
獲得Fragment的狀態是可見還是不可見的,如果可見則進行懶載入操作。onAttach()
:執行該方法時,Fragment與Activity已經完成繫結,該方法有一個Activity型別的引數,代表繫結的Activity,這時候你可以執行諸如mActivity = activity的操作。onCreate()
:初始化Fragment。可通過引數savedInstanceState
獲取之前儲存的值。onCreateView()
:初始化Fragment的佈局。載入佈局和findViewById的操作通常在此函式內完成,但是不建議執行耗時的操作,比如讀取資料庫資料列表。onActivityCreated()
:執行該方法時,與Fragment繫結的Activity的onCreate方法已經執行完成並返回,在該方法內可以進行與Activity互動的UI操作,所以在該方法之前Activity的onCreate方法並未執行完成,如果提前進行互動操作,會引發空指標異常。onStart()
:執行該方法時,Fragment由不可見變為可見狀態。onResume()
:執行該方法時,Fragment處於活動狀態,使用者可與之互動。onPause()
:執行該方法時,Fragment處於暫停狀態,但依然可見,使用者不能與之互動。onSaveInstanceState()
:儲存當前Fragment的狀態。該方法會自動儲存Fragment的狀態,比如EditText鍵入的文字,即使Fragment被回收又重新建立,一樣能恢復EditText之前鍵入的文字。onStop()
:執行該方法時,Fragment完全不可見。onDestroyView()
:銷燬與Fragment有關的檢視,但未與Activity解除繫結,依然可以通過onCreateView方法重新建立檢視。通常在ViewPager+Fragment的方式下會呼叫此方法。onDestroy()
:銷燬Fragment。通常按Back鍵退出或者Fragment被回收時呼叫此方法。onDetach()
:解除與Activity的繫結。在onDestroy方法之後呼叫。
Fragment生命週期執行流程(注意紅色的不是生命週期方法):
- Fragment建立 :
setUserVisibleHint()->onAttach()->onCreate()->onCreateView()->onActivityCreated()->onStart()->onResume()
; - Fragment變為不可見狀態 (鎖屏、回到桌面、被Activity完全覆蓋):
onPause()->onSaveInstanceState()->onStop()
; - Fragment變為部分可見狀態 (開啟Dialog樣式的Activity):
onPause()->onSaveInstanceState()
; - Fragment由不可見變為活動狀態 :
onStart()->OnResume()
; - Fragment由部分可見變為活動狀態 :
onResume()
; - 退出應用 :
onPause()->onStop()->onDestroyView()->onDestroy()->onDetach()
(注意退出不會呼叫onSaveInstanceState()
方法,因為是人為退出,沒有必要再儲存資料); - Fragment被回收又重新建立:
- 被回收執行
onPause()->onSaveInstanceState()->onStop()->onDestroyView()->onDestroy()->onDetach()
, - 重新建立執行
onAttach()->onCreate()->onCreateView()->onActivityCreated()->onStart()->onResume()->setUserVisibleHint()
;
- 被回收執行
- 橫豎屏切換:與Fragment被回收又重新建立一樣。
最後附上一張官方生命週期流程圖:
相關文章
- Fragment生命週期Fragment
- Android | Activity和Fragment最全生命週期+發現大牛AndroidFragment
- 2018.03.05 Android 記一次關於Fragment生命週期的討論。AndroidFragment
- View生命週期與Activity生命週期的關係View
- 生命週期
- viewController的生命週期ViewController
- Servlet的生命週期Servlet
- UIViewController的生命週期UIViewController
- Flutter 的生命週期Flutter
- Spring的生命週期Spring
- bean的生命週期Bean
- SQL的生命週期SQL
- Laravel的生命週期Laravel
- 類的生命週期
- [譯] android應用開發者,你們真的瞭解Fragment的生命週期嗎?AndroidFragment
- 品牌生命週期和產品生命週期之間的關係
- vue - 生命週期Vue
- vue生命週期Vue
- spring生命週期Spring
- ubuntu生命週期Ubuntu
- Flutter - 生命週期Flutter
- sessionStorag 生命週期Session
- PHP 生命週期PHP
- maven生命週期Maven
- Activity生命週期
- React生命週期React
- React新的生命週期React
- iOS APP的生命週期iOSAPP
- Vue生命週期的理解Vue
- Java 物件的生命週期Java物件
- Avalonia的Window生命週期
- Flutter widget的生命週期Flutter
- Spring Bean的生命週期SpringBean
- Spring的生命週期主Spring
- Spring Bean 的生命週期SpringBean
- Salesforce 生命週期管理(一)應用生命週期淺談Salesforce
- Vue的生命週期的理解Vue
- vue 生命週期梳理Vue
- java servlet 生命週期JavaServlet