Activity的生命週期

Activity生命週期

典型狀態下的生命週期圖

圖片來自Android Develper網站

  • onCreate
    生命週期的第一個方法,表示Activity正在被創建。在這個方法中,可以做一些初始化操作,但是不要做耗時操作,也可以對界面的主題樣式進行設置。當然,最重要的就是在該方法中指定佈局。
	//設置樣式的方法必須位於setContentView之前
	requestWindowFeature(Window.FEATURE_NO_TITLE);//不顯示標題欄 
	  getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
//  getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
	setContentView(R.layout.activity_main);

  • onStart
    表示Activity正在被啓動,這是Activity已經可見了,但是沒有出現在前臺,無法和用戶進行交互。
  • onResume
    表示Activity已經可見,且可以和用戶進行交互。雖然onStart和onResume都表示Activity已經可見,但是onStart的時候Activity還在後臺,onResume的時候Activity才顯示到前臺
  • onPause
    表示Activity正在停止,緊接着onStop會被調用。在該方法中可以做一些不耗時的操作,否則會影響新的Activity的顯示。
  • onStop
    表示Activity即將停止,可以做一些重量級的回收工作,同樣不能做耗時操作。
  • onRestart
    當位於後臺的Activity重新回到前臺時,會調用該方法,然後調用onStart->onResume
  • onDestroy
    表示Activity即將被銷燬,我們可以做一些回收工作和最終資源釋放。

注意點:
1、onStart、onResume、onPause、onStop的區別?
onStart和onStop是一對,onResume和onPause是一對,onStart和onStop是正對界面的可見性而言的,onResume和onPause是針對界面是否在前臺而言的。
2、當前界面爲A,打開一個界面B,A、B的生命週期是怎樣的?關閉B之後,AB生命週期又是怎樣的?
A:onPause -> B:onCreate -> B:onStart -> B:onResume -> A:onStop
關閉B
B:onPause -> A:onRestart -> A:onStart -> A:onResume -> B:onStop -> B:onDestory

異常情況下的生命週期

資源相關配置發生改變導致Activity被殺死並重新創建

例如:當手機進行橫豎屏切換時,由於系統配置發生了改變,在默認情況下,Activity會被銷燬並且重新創建。
圖片來自於Android開發藝術探索--任玉剛
生命週期:
onPause -> onSaveInstanceState -> onStop -> onDestory
注意:onSaveInstanceState一定會在onStop方法之前調用,不一定一定在onPause之後調用
onCreate -> onStart -> onRestoreInstanceState -> onResume

當然,我們也可以通過修改配置文件,阻止系統重新創建Activity。

<activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" 
                //該配置用來阻止指定的情況下,不重新創建界面
                	android:configChanges="orientation|screenSize|screenLayout"/>

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
</activity>

當對應系統配置發生改變時,不會重新創建Activity,同時回掉onConfigurationChanged方法,因此可以在onConfigurationChanged方法中做配置改變後相關操作。

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.e(TAG,"onConfigurationChanged");
    }

系統資源不足導致優先級低的Activity被殺死

這種情況不好模擬,但是其數據存儲和恢復情況和上述情況完全一致。
Activity的優先級從高到低可分爲如下三種:

  1. 前臺Activity,正在和用戶進行交互,優先級最高
  2. 可見但非前臺Activity——彈出對話框的Activity
  3. 後臺Activity——已經被暫停的Activity,優先級最低

Fragment的生命週期

Fragment的生命週期

網絡盜圖

Activity生命週期和Fragment生命週期的比較

網絡盜圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章