1. 程式人生 > >Activity與Fragment的生命週期詳解

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完全相同。