Android入門教程之組件Activity的生命周期詳解

返回棧

Android 中的 Activity 是可以層疊的,我們每啟動一個新的 Activity,就會覆蓋在原有的 Activity 之上,然後點擊 Back 鍵會銷毀最上面的 Activity,下面的一個 Activity 就會重新顯示出來

其實 Android 是使用任務(task)來管理 Activity 的,一個任務就是一組存放在棧裡的 Activity 的集合,這個棧也被稱作返回棧

默認情況下,啟動一個新的 Activity,它就會在返回棧中入棧,並處於棧頂的位置。而每當我們按下 Back 鍵或調用 finish() 方法銷毀一個 Activity 時,處於棧頂的 Activity 就會出棧,前一個入棧的 Activity 就會重新處於棧頂的位置。系統總是會顯示處於棧頂的 Activity 給用戶

Activity 狀態

每個 Activity 在其生命周期中最多可能有四種狀態:

1. 運行狀態

當一個 Activity 位於返回棧的棧頂時,Activity 就處於運行狀態

2. 暫停狀態

當一個 Activity 不再處於棧頂位置,但仍然可見時,Activity 就進入瞭暫停狀態

3. 停止狀態

當一個 Activity 不再處於棧頂位置,並且完全不可見時,就進入瞭停止狀態

4. 銷毀狀態

一個 Activity 從返回棧中移除後就變成瞭銷毀狀態

Activity 的生存期

Activity 類中定義瞭七個回調方法,覆蓋瞭 Activity 生命周期的每一個環節:

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 被重新啟動瞭

以上七個方法中除瞭 onRestart() 方法,其他都是兩兩相對的,從而又可以將 Activity 分為以下三種生存期:

完整生存期

Activity 在 onCreate() 方法和 onDestroy() 方法之間所經歷的就是完整生存期。一般情況下,一個 Activity 會在 onCreate() 方法中完成各種初始化操作,而在 onDestroy() 方法中完成釋放內存的操作

可見生存期

Activity 在 onStart() 方法和 onStop() 方法之間所經歷的就是可見生存期。在可見生存期內,Activity 對於用戶總是可見的,即便有可能無法和用戶進行交互。我們可以通過這兩個方法合理地管理那些對用戶可見的資源。比如在 onStart() 方法中對資源進行加載,而在 onStop() 方法中對資源進行釋放,從而保證處於停止狀態的 Activity 不會占用過多內存

前臺生存期

Activity 在 onResume() 方法和 onPause() 方法之間所經歷的就是前臺生存期。在前臺生存期內,Activity 總是運行狀態,此時的 Activity 是可以和用戶進行交互的,我們平時看到的和接觸最多的就是這個狀態下的 Activity

在這裡插入圖片描述

Activity 回收處理

當一個 Activity 進入瞭停止狀態,是有可能被系統回收的。如果一個 Activity 由於系統內存不足而被回收,用戶再返回該 Activity 時,其實還是會正常顯示的,但這時並不會執行 onRestart() 方法,而是會執行 Activity 的 onCreate() 方法,因為 Activity 在這種情況下會被重新創建一次

如果 Activity 存在臨時數據和狀態,比如文本輸入框已經輸入瞭一段文字,回來以後文字都沒瞭,那這是比較影響用戶體驗的。Activity 提供瞭一個 onSaveInstanceState() 回調方法,該方法可以保證在 Activity 被回收之前一定會被調用,可以通過這個方法來解決這個問題

onSaveInstanceState() 方法會攜帶一個 Bundle 類型的參數,Bundle 提供瞭一系列的方法用於保存數據

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    var tempData = "Something you just typed"
    outState.putString("data_key", tempData)
}

數據保存以後,在 onCreate() 方法有一個 Bundle 類型參數,該參數帶有之前保存的全部數據,隻需再通過相應的取值方法將數據取出即可

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    if (savedInstanceState != null) {
        val tempData = savedInstanceState.getString("data_key")
    }
}

到此這篇關於Android入門教程之組件Activity的生命周期詳解的文章就介紹到這瞭,更多相關Android Activity內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: