Activity與Fragment的生命週期詳解
在安卓中Activity與Fragment是非常相似的兩個類,它們各自都擁有自己的生命週期,且都可以用來顯示佈局檔案中的檢視。其中Activity是通過setContenView()顯示檢視,而Fragment是通過在onCreateView()中將佈局xml檔案解析為一個View然後返回該View來顯示檢視,也正因為具備相似的功能,所以它們的生命週期也極為相似,熟練掌握它們的生命週期是做出高效穩定APP的關鍵。下面就仔細分析一下它們的異同。
一.Activity的生命週期
首先我們來看一下官方文件中給出的圖示:
通過上述圖示,我們可以總結Activity的生命週期規律如下:
1.啟動Activity:系統會先呼叫onCreate方法,然後呼叫onStart方法,最後呼叫onResume,Activity進入執行狀態。
2.當前Activity被其他Activity覆蓋其上或被鎖屏:系統會呼叫onPause方法,暫停當前Activity的執行。
3.當前Activity由被覆蓋狀態回到前臺或解鎖屏:系統會呼叫onResume方法,再次進入執行狀態。
4.當前Activity轉到新的Activity介面或按Home鍵回到主屏,自身退居後臺:系統會先呼叫onPause方法,然後呼叫onStop方法,進入停滯狀態。
5.使用者後退回到此Activity:系統會先呼叫onRestart方法,然後呼叫onStart方法,最後呼叫onResume方法,再次進入執行狀態。
6.當前Activity處於被覆蓋狀態或者後臺不可見狀態,即第2步和第4步,系統記憶體不足,殺死當前Activity,而後使用者退回當前Activity:再次呼叫onCreate方法、onStart方法、onResume方法,進入執行狀態。
7.使用者退出當前Activity:系統先呼叫onPause方法,然後呼叫onStop方法,最後呼叫onDestory方法,結束當前Activity。
注意onPause與onStop的不同,onPause表示該Activity處於可見狀態但無法獲取使用者焦點,如在當前Activity上彈出一個對話方塊,則使用者焦點被對話方塊獲取,但當前Activity仍然可以看到,而onStop表示該Activity處於不可見狀態,如從一個Activity跳轉到另一個Activity,則之前的Activity處於不可見狀態。
二Fragment的生命週期
還是先上官方文件圖:
從上述圖示可以看到Fragment與Activity的生命週期極其相似,我們先看一下只存在於Fragment中的幾個方法:
onAttach方法:顧名思義,是Fragment和Activity建立關聯的時候呼叫。
onCreateView方法:為Fragment載入佈局時呼叫。
onActivityCreated方法:當Activity中的onCreate方法執行完後呼叫。
onDestroyView方法:Fragment中的佈局被移除時呼叫。
onDetach方法:顧名思義,是Fragment和Activity解除關聯的時候呼叫。
重點注意一下onActivityCreated(),因為該方法是在Activity中的onCreate方法執行完成後呼叫,所以在onActivityCreated()呼叫之前 Activity的onCreate可能還沒執行,所以不能在onCreateView()中進行 與Activity相關的UI操作,而應該在onActivityCreated()中進行與Activity相關的UI操作,而onCreateView中只進行UI的顯示操作。
另外需要注意Fragment中不存在onRestart()方法,該方法只存在與Activity中。
下面通過執行程式碼的方式來驗證一下:
執行結果如下:public class Fragment1 extends Fragment { public static final String TAG = "Fragment1"; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.d(TAG, "onCreateView"); return inflater.inflate(R.layout.fragment1, container, false); } @Override public void onAttach(Activity activity) { super.onAttach(activity); Log.d(TAG, "onAttach"); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "onCreate"); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); Log.d(TAG, "onActivityCreated"); } @Override public void onStart() { super.onStart(); Log.d(TAG, "onStart"); } @Override public void onResume() { super.onResume(); Log.d(TAG, "onResume"); } @Override public void onPause() { super.onPause(); Log.d(TAG, "onPause"); } @Override public void onStop() { super.onStop(); Log.d(TAG, "onStop"); } @Override public void onDestroyView() { super.onDestroyView(); Log.d(TAG, "onDestroyView"); } @Override public void onDestroy() { super.onDestroy(); Log.d(TAG, "onDestroy"); } @Override public void onDetach() { super.onDetach(); Log.d(TAG, "onDetach"); } }
直接點選home鍵,執行結果如下:
然後回到程式,執行結果如下:
最後點選back鍵退出程式,執行結果如下:
從執行結果可以看到除了Fragment中獨有的幾個方法外,其餘的執行結果與Activity完全相同。