fragment生命週期(總結)

最愛媽媽本尊發表於2017-11-28

前言:

這篇文章和上一篇文章一樣,基本上都是總結,沒有給出實際的log日誌和片段程式碼,我覺得這些東西需要自己去實踐證實,而不是看到別人貼的程式碼就認為是對的,上一篇文章是activity的生命週期(總結),後續會一直整理我有道筆記裡面總結的一些問題,都是比較實際性的總結,希望對大家有幫助。

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方法之後呼叫。
setUserVisibleHint():
設定Fragment可見或者不可見時會呼叫此方法。在該方法裡面可以通過呼叫getUserVisibleHint()獲得Fragment的狀態是可見還是不可見的,如果可見則進行懶載入操作。

Fragment生命週期執行流程:

1、Fragment建立:
setUserVisibleHint()->onAttach()->onCreate()->onCreateView()->onActivityCreated()->onStart()->onResume();
2、Fragment變為不可見狀態(鎖屏、回到桌面、被Activity完全覆蓋)
onPause()->onSaveInstanceState()->onStop();
3、Fragment變為部分可見狀態(開啟Dialog樣式的Activity)
onPause()->onSaveInstanceState();
4、Fragment由不可見變為活動狀態:
onStart()->OnResume();
5、Fragment由部分可見變為活動狀態:
onResume();
5、Fragment退出
onPause()->onStop()->onDestroyView()->onDestroy()->onDetach()(注意退出不會呼叫onSaveInstanceState方法,因為是人為退出,沒有必要再儲存資料);
6、Fragment被回收又重新建立:
被回收執行onPause()->onSaveInstanceState()->onStop()->onDestroyView()->onDestroy()->onDetach(),重新建立執行onAttach()->onCreate()->onCreateView()->onActivityCreated()->onStart()->onResume()->setUserVisibleHint();
橫豎屏切換:與Fragment被回收又重新建立一樣。

onHiddenChanged的回撥時機

當使用add()+show(),hide()跳轉新的Fragment時,舊的Fragment回撥onHiddenChanged(),不會回撥onStop()等生命週期方法,而新的Fragment在建立時是不會回撥onHiddenChanged(),這點要切記。

FragmentPagerAdapter+ViewPager的注意事項

1、 使用FragmentPagerAdapter+ViewPager時,切換回上一個Fragment頁面時(已經初始化完畢),不會回撥任何生命週期方法以及onHiddenChanged(),只有setUserVisibleHint(boolean isVisibleToUser)會被回撥,所以如果你想進行一些懶載入,需要在這裡處理。
2、 在給ViewPager繫結FragmentPagerAdapter時,
new FragmentPagerAdapter(fragmentManager)的FragmentManager,一定要保證正確,如果ViewPager是Activity內的控制元件,則傳遞getSupportFragmentManager(),如果是Fragment的控制元件中,則應該傳遞getChildFragmentManager()。只要記住ViewPager內的Fragments是當前元件的子Fragment這個原則即可。
3、 你不需要考慮在“記憶體重啟”的情況下,去恢復的Fragments的問題,因為FragmentPagerAdapter已經幫我們處理啦。

setUserVisibleHint()不呼叫的問題

通常情況下都是因為PagerAdapter不是FragmentPagerAdapter造成的,FragmentPagerAdapter內部實現了對setUserVisibleHint()方法的呼叫,所以需要懶載入的結構最好使用FragmentPagerAdapter +Fragment的結構,少用PagerAdapter。

相關文章