天天看點

activity 生命周期_從0系統學Android-2.4 Activity 的生命周期

本系列文章,參考《第一行代碼》,作為個人筆記

更多内容:更多精品文章分類

本系列持續更新中….
activity 生命周期_從0系統學Android-2.4 Activity 的生命周期

2.4 Activity 的生命周期

掌握 Activity 的生命周期對于開發者來說是非常重要的!

2.4.1 傳回棧

Android 中的 Activity 是可以層疊的。我們每次啟動一個新的 Activity,就會覆寫在原來的 Activity 上面,然後點選

back

鍵就會銷毀最上面的 Activity,下面的 Activity 就會重新顯示出來。

Android 使用任務(Task)來管理 Activity 的,一個任務(Task)就是一組存放在棧中的 Activity 的集合。這個棧也被稱為傳回棧(Back Task)。

棧是一種後進先出的資料結構,預設情況下,每當我們啟動一個新的 Activity,這個 Activity 就會在傳回棧中入棧,并且處于棧頂的位置。每當我們按下

Back

鍵或者調用

finish

方法後就會銷毀一個 Activity。處于棧頂的Activity 就會出棧,這是前一個入棧的 Activity 就會重新處于棧頂的位置。系統總是會顯示處于棧頂的 Activity 給使用者。

activity 生命周期_從0系統學Android-2.4 Activity 的生命周期

2.4.2 Activity 狀态

每個 Activity 在其生命周期中最多有 4 種狀态。

1.運作狀态

當一個 Activity 處于傳回棧的棧頂的時候,這個時候的 Activity 就是運作狀态。系統是最不願意回收這種狀态的 Activity 的。

2.暫停狀态

當一個 Activity 不處于棧頂狀态但是仍然可見的時候,這種狀态稱為暫停狀态。不處于棧頂仍然可見是因為很多 Activity 不一定是占滿全屏的,比如對話框形式的 Activity。這種狀态的 Activity 系統也是不願意回收的,除非記憶體極低的情況。

3.停止狀态

當 Activity 不處于棧頂狀态并且不可見的時候,這種狀态稱為停止狀态。這種狀态下系統仍然會保留 Activity 的相應狀态和變量。但是當記憶體不太足,也是可能會被回收的。

4.銷毀狀态

Activity 從棧中移除,這個時候就稱為銷毀狀态。系統最傾向回收銷毀狀态的 Activity,進而保證記憶體充足。

2.4.3 Activity 的生存期

Activity 中定義了 7 個回調方法,覆寫了聲明周期的每一個環節。

onCreate()

Activity 第一次被建立的時候調用。應該在這個方法裡完成 Activity 的初始化操作,比如:加載布局、綁定事件等。

onStart()

這個方法在 Activity 由不可見變為可見的時候調用

onResume()

這個方法在 Activity 準備好和使用者進行互動的時候調用。此時 Activity 一定位于棧頂,并且處于運作狀态

onPause()

在系統準備啟動或者恢複另一個 Activity 的時候調用。我們通常會在這個方法中将一些消耗 CPU 的資源釋放掉,以及儲存一些關鍵的資料,但是這個

方法的執行速度一定要快

,不然會影響到新的棧頂 Activity 的使用。

onStop()

這個方法在 Activity 完全不可見的時候調用。它和 onPause 的主要差別在于,如果啟動的

Activity 是一個對話框式的 Activity 的時候,那麼

onPause()

會得到執行,而

onStop()

不會執行。

onDestroy()

這個方法在 Activity 被銷毀

調用,之後 Activity 的狀态就處于銷毀狀态。

onRestart()

這個方法 Activity 由停止狀态變為運作狀态之前調用,也就是 Activity 被重新恢複了。

以上的 7 個方法除了

onRestart()

方法外,其餘的都是兩兩相對,進而又将 Activity 分為 3 對生存期。

完整生存期

Activity 在

onCreate()

onDestroy()

方法之間所經曆的,就是完整的生存期。一般情況下 Activity 會在

onCreate()

方法中完成各種初始化操作,

onDestroy()

中完成釋放記憶體操作。

可見生存期

Activity 在

onStart()

onStop()

方法之間所經曆的就是完整的可見生存期。在可見生存期内,Activity 對使用者是可見的,但是可能無法了使用者互動。可以通過這兩個方法來合理的管理那些對使用者可見的資源。比如在

onStart()

方法中對資源進行加載,而

onStop()

方法中對資源進行釋放,進而保證處于停止狀态的 Activity 不會占用過多的記憶體。

前台生存期

Activity 在

onResume()

onPause()

方法之間所經曆的就是前台生存期。在前台生存期,Activity 總是處于運作狀态,此時 Activity是可以與使用者互動的,我們平時看到和接觸最多的就是這個狀态下的 Activity 了。

activity 生命周期_從0系統學Android-2.4 Activity 的生命周期

2.4.4 體驗 Activity 的生命周期

上面主要是理論的知識,下面從實戰方向出發,去體驗一下 Activity 的生命周期。

這裡建立一個項目,項目中有兩個 Activity ,一個是普通的 Activity ,一個是對話框式的 Activity。展現對話框式的 Activity 就是要修改一下這個 Activity 的樣式。在

AndroidManifest.xml

Activity

标簽配置中

<activity android:name=".DialogActivity"
        android:theme="@style/Theme.AppCompat.Dialog">
</activity>
           

就是通過 android:theme 屬性來設定。Android 系統内置了很多的主題可以選擇。

MainActivity 中有兩個按鈕,第一個按鈕啟動 NormalActivity ,第二個按鈕啟動 DialogActivity。

下面啟動 MainActivity,這個時候的列印資訊是:

MainActivity:onCreate
MainActivity:onStart
MainActivity:onResume
           

然後點選第一個按鈕啟動 NormalActivity,列印資訊:

MainActivity:onPause
MainActivity:onStop
           

由于 NormalActivity 已經把 MainActivity 徹底遮擋住了,是以 onPause 和 onStop 方法都執行。

然後按下 Back 鍵,傳回到 MainActivity ,列印資訊:

MainActivity:onRestart
MainActivity:onStart
MainActivity:onResume
           

由于之前 MainActivity 已經進入了停止狀态,是以 onRestart 方法會得到執行。

點選第二個按鈕,啟動 DialogActivity,此時列印資訊:

MainActivity:onPause
           

onStop 方法并沒有執行,這是因為 DialogActivity 并沒有完全遮蓋住 MainActivity,此時 MainActivity 隻是進入了暫停狀态,并沒有進入停止狀态。

2.4.5 Activity 被回收了怎麼辦?

一個 Activity 在進入了停止狀态後,就有可能會被系統回收。

比如:應用中有一個 Activity A,使用者在 A 的基礎上啟動了 Activity B ,這個時候 A 進入了停止狀态,由于系統記憶體不足,A 被回收了。然後使用者按下了 Back 鍵傳回 A 。這個時候會出現什麼問題呢?

其實 A 會正常顯示,隻不過不會執行 onRestart 方法了,而是會執行 onCreate 方法。重新建立一次。那麼之前的狀态就全沒有了。

這個時候

onSaveInstanceState()

方法排上用場了,這個方法可以保證在 Activity 被回收前一定會被調用,是以我們可以通過這個方法來儲存 Activity 被回收前的狀态資料。

@Override
protected void onSaveInstanceState(Bundle outState){
  super.onSaveInstanceState(Bundle outState);
  String tempData = "要儲存的狀态";
  outState.putString("data",tempData);  
}
           

資料儲存下來了,然後我們就可以通過 onCreate() 方法中的參數來擷取裡面的資料了。

activity 生命周期_從0系統學Android-2.4 Activity 的生命周期

繼續閱讀