溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何理解Android中組件Activity的生命周期

發(fā)布時(shí)間:2021-10-09 11:22:31 來源:億速云 閱讀:120 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要講解了“如何理解Android中組件Activity的生命周期”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“如何理解Android中組件Activity的生命周期”吧!

目錄
  • 返回棧

  • Activity 狀態(tài)

    • 1. 運(yùn)行狀態(tài)

    • 2. 暫停狀態(tài)

    • 3. 停止?fàn)顟B(tài)

    • 4. 銷毀狀態(tài)

  • Activity 的生存期

    • onCreate()

    • onStart()

    • onResume()

    • onPause()

    • onStop()

    • onDestroy()

    • onRestart()

    • 完整生存期

    • 可見生存期

    • 前臺生存期

  • Activity 回收處理

    返回棧

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

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

    默認(rèn)情況下,啟動一個(gè)新的 Activity,它就會在返回棧中入棧,并處于棧頂?shù)奈恢?。而每?dāng)我們按下 Back 鍵或調(diào)用 finish() 方法銷毀一個(gè) Activity 時(shí),處于棧頂?shù)?Activity 就會出棧,前一個(gè)入棧的 Activity 就會重新處于棧頂?shù)奈恢谩O到y(tǒng)總是會顯示處于棧頂?shù)?Activity 給用戶

    Activity 狀態(tài)

    每個(gè) Activity 在其生命周期中最多可能有四種狀態(tài):

    1. 運(yùn)行狀態(tài)

    當(dāng)一個(gè) Activity 位于返回棧的棧頂時(shí),Activity 就處于運(yùn)行狀態(tài)

    2. 暫停狀態(tài)

    當(dāng)一個(gè) Activity 不再處于棧頂位置,但仍然可見時(shí),Activity 就進(jìn)入了暫停狀態(tài)

    3. 停止?fàn)顟B(tài)

    當(dāng)一個(gè) Activity 不再處于棧頂位置,并且完全不可見時(shí),就進(jìn)入了停止?fàn)顟B(tài)

    4. 銷毀狀態(tài)

    一個(gè) Activity 從返回棧中移除后就變成了銷毀狀態(tài)

    Activity 的生存期

    Activity 類中定義了七個(gè)回調(diào)方法,覆蓋了 Activity 生命周期的每一個(gè)環(huán)節(jié):

    onCreate()

    它會在 Activity 第一次被創(chuàng)建時(shí)調(diào)用,可以在這個(gè)方法中完成 Activity 的初始化操作,比如加載布局、綁定事件等

    onStart()

    這個(gè)方法在 Activity 由不可見變?yōu)榭梢姷臅r(shí)候調(diào)用

    onResume()

    這個(gè)方法在 Activity 準(zhǔn)備好和用戶進(jìn)行交互時(shí)調(diào)用,此時(shí)的 Activity 一定位于返回棧的棧頂,并且處于運(yùn)行狀態(tài)

    onPause()

    這個(gè)方法在系統(tǒng)準(zhǔn)備去啟動或者恢復(fù)另一個(gè) Activity 的時(shí)候調(diào)用,我們通常會在這個(gè)方法將一些消耗 CPU 的資源釋放掉,以及保存一些關(guān)鍵數(shù)據(jù),但這個(gè)方法的執(zhí)行速度一定要快,不然會影響到新的棧頂 Activity 的使用

    onStop()

    這個(gè)方法在 Activity 完全不可見的時(shí)候調(diào)用,它和 onPause() 方法的主要區(qū)別在于,如果啟動的新的 Activity 是一個(gè)對話框式的 Activity,那么 onPause() 方法會得到執(zhí)行,而 onStop() 方法并不會執(zhí)行

    onDestroy()

    這個(gè)方法在 Activity 被銷毀之前調(diào)用,之后 Activity 的狀態(tài)將變?yōu)殇N毀狀態(tài)

    onRestart()

    這個(gè)方法在 Activity 由停止?fàn)顟B(tài)變?yōu)檫\(yùn)行狀態(tài)之前調(diào)用,也就是 Activity 被重新啟動了

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

    完整生存期

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

    可見生存期

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

    前臺生存期

    Activity 在 onResume() 方法和 onPause() 方法之間所經(jīng)歷的就是前臺生存期。在前臺生存期內(nèi),Activity 總是運(yùn)行狀態(tài),此時(shí)的 Activity 是可以和用戶進(jìn)行交互的,我們平時(shí)看到的和接觸最多的就是這個(gè)狀態(tài)下的 Activity

    Activity 回收處理

    當(dāng)一個(gè) Activity 進(jìn)入了停止?fàn)顟B(tài),是有可能被系統(tǒng)回收的。如果一個(gè) Activity 由于系統(tǒng)內(nèi)存不足而被回收,用戶再返回該 Activity 時(shí),其實(shí)還是會正常顯示的,但這時(shí)并不會執(zhí)行 onRestart() 方法,而是會執(zhí)行 Activity 的 onCreate() 方法,因?yàn)?Activity 在這種情況下會被重新創(chuàng)建一次

    如果 Activity 存在臨時(shí)數(shù)據(jù)和狀態(tài),比如文本輸入框已經(jīng)輸入了一段文字,回來以后文字都沒了,那這是比較影響用戶體驗(yàn)的。Activity 提供了一個(gè) onSaveInstanceState() 回調(diào)方法,該方法可以保證在 Activity 被回收之前一定會被調(diào)用,可以通過這個(gè)方法來解決這個(gè)問題

    onSaveInstanceState() 方法會攜帶一個(gè) Bundle 類型的參數(shù),Bundle 提供了一系列的方法用于保存數(shù)據(jù)

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

    數(shù)據(jù)保存以后,在 onCreate() 方法有一個(gè) Bundle 類型參數(shù),該參數(shù)帶有之前保存的全部數(shù)據(jù),只需再通過相應(yīng)的取值方法將數(shù)據(jù)取出即可

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

    感謝各位的閱讀,以上就是“如何理解Android中組件Activity的生命周期”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對如何理解Android中組件Activity的生命周期這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI