溫馨提示×

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

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

Android中Activity的生命周期是什么

發(fā)布時(shí)間:2022-04-13 15:35:12 來(lái)源:億速云 閱讀:131 作者:iii 欄目:編程語(yǔ)言

這篇文章主要介紹“Android中Activity的生命周期是什么”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“Android中Activity的生命周期是什么”文章能幫助大家解決問(wèn)題。

注意到在A(yíng)ctivity的API中有大量的onXXXX形式的函數(shù)定義,除了我們前面用到的onCreate以外,還有onStart,onStop以及onPause等等。從字面上看,它們是一些事件回調(diào),那么次序又是如何的呢?其實(shí)這種事情,自己做個(gè)實(shí)驗(yàn)最明白不過(guò)了。在做這個(gè)實(shí)驗(yàn)之前,我們先得找到在A(yíng)ndroid中的Log是如何輸出的。

顯然,我們要用的是android.util.log類(lèi),這個(gè)類(lèi)相當(dāng)?shù)暮?jiǎn)單易用,因?yàn)樗峁┑娜且恍╈o態(tài)方法:

Log.v(String tag, String msg); //VERBOSE  Log.d(String tag, String msg); //DEBUG   Log.i(String tag, String msg); //INFO  Log.w(String tag, String msg); //WARN  Log.e(String tag, String msg); //ERROR

前面的tag是由我們定義的一個(gè)標(biāo)識(shí),一般可以用“類(lèi)名_方法名“來(lái)定義。

輸出的LOG信息,如果用Eclipse+ADT開(kāi)發(fā),在LogCat中就可以看到,否則用adb logcat也行,不過(guò)我是從來(lái)都依賴(lài)于IDE環(huán)境的。

好了,現(xiàn)在我們修改前面的HelloThree代碼:

public void onStart()  ...{  super.onStart();  Log.v(TAG,"onStart");  }  public void onStop()  ...{  super.onStop();  Log.v(TAG,"onStop");  }  public void onResume()  ...{  super.onResume();  Log.v(TAG,"onResume");  }  public void onRestart()  ...{  super.onRestart();  Log.v(TAG,"onReStart");  }  public void onPause()  ...{  super.onPause();  Log.v(TAG,"onPause");  }  public void onDestroy()  ...{  super.onDestroy();  Log.v(TAG,"onDestroy");  }  public void onFreeze(Bundle outState)  ...{  super.onFreeze(outState);  Log.v(TAG,"onFreeze");  }

在HelloThreeB中也同樣增加這樣的代碼,編譯,運(yùn)行一下,從logcat中分析輸出的日志。

在啟動(dòng)***個(gè)界面Activity One時(shí),它的次序是:

onCreate (ONE) - onStart (ONE) - onResume(ONE)


雖然是***次啟動(dòng),也要走一遍這個(gè)resume事件。然后,我們點(diǎn)goto跳到第二個(gè)Activity Two中(前一個(gè)沒(méi)有關(guān)閉),這時(shí)走的次序是:

  1. onFreeze(ONE) - onPause(ONE) - onCreate(TWO) - 
    onStart(TWO) - onResume(TWO) - onStop(ONE) 

說(shuō)明,第二個(gè)Activity Two在啟動(dòng)前,One會(huì)經(jīng)歷一個(gè):凍結(jié)、暫停的過(guò)程,在啟動(dòng)Two后,One才會(huì)被停止?

然后,我們?cè)冱c(diǎn)back回到***個(gè)界面,這時(shí)走的次序是:

  1. onPause(TWO) - onActivityResult(ONE) - onStart(ONE) - 
    onRestart(ONE) - onResume(ONE) - onStop(TWO) - onDestroy(TWO) 

說(shuō)明,返回時(shí),Two沒(méi)有經(jīng)歷凍結(jié)就直接暫停了,在One接收參數(shù),重啟后,Two就停止并被銷(xiāo)毀了。***,我們點(diǎn)一下Exit退出應(yīng)用,它的次序是:

onPause(ONE) - onStop(ONE) - onDestroy(ONE)

說(shuō)明如果我們用了finish的話(huà),不會(huì)有freeze,但是仍會(huì)經(jīng)歷pause - stop才被銷(xiāo)毀。

這里有點(diǎn)疑問(wèn)的是:為什么回來(lái)時(shí)先是Start才是Restart?可是文檔中的圖上畫(huà)的卻是先restart再start的???不過(guò),后面的表格中的描述好象是正確的,start后面總是跟著resume(如果是***次)或者restart(如果原來(lái)被stop掉了,這種情況會(huì)在start與resume 中插一個(gè)restart)。

  • Android Button應(yīng)用法則

  • Android模擬SD卡實(shí)現(xiàn)方法解析

  • Android onKey操作方式介紹

  • Android消息傳遞應(yīng)用功能解析

  • Android繪圖具體應(yīng)用方式總結(jié)

下面不跑例子了,看看Android Activity生命周期的文檔吧。

1.Android用Activity Stack來(lái)管理多個(gè)Activity,所以呢,同一時(shí)刻只會(huì)有最頂上的那個(gè)Activity是處于active或者running狀態(tài)。其它的Activity都被壓在下面了。

2. 如果非活動(dòng)的Activity仍是可見(jiàn)的(即如果上面壓著的是一個(gè)非全屏的Activity或透明的Activity),它是處于paused狀態(tài)的。在系統(tǒng)內(nèi)存不足的情況下,paused狀態(tài)的Activity是有可被系統(tǒng)殺掉的。只是不明白,如果它被干掉了,界面上的顯示又會(huì)變成什么模樣?看來(lái)下回有必要研究一下這種情況了。

3.幾個(gè)事件的配對(duì)可以比較清楚地理解它們的關(guān)系。Create與Destroy配成一對(duì),叫entrie lifetime,在創(chuàng)建時(shí)分配資源,則在銷(xiāo)毀時(shí)釋放資源;往上一點(diǎn)還有Start與Stop一對(duì),叫visible lifetime,表達(dá)的是可見(jiàn)與非可見(jiàn)這么一個(gè)過(guò)程;最頂上的就是Resume和Pause這一對(duì)了,叫foreground lifetime,表達(dá)的了是否處于激活狀態(tài)的過(guò)程。

4.因此,我們實(shí)現(xiàn)的Activity派生類(lèi),要重載兩個(gè)重要的方法:onCreate()進(jìn)行初始化操作,onPause()保存當(dāng)前操作的結(jié)果。

除了Activity Lifecycle以外,Android還有一個(gè)Process Lifecycle的說(shuō)明:

在內(nèi)存不足的時(shí)候,Android是會(huì)主動(dòng)清理門(mén)戶(hù)的,那它又是如何判斷哪個(gè)process是可以清掉的呢?文檔中也提到了它的重要性排序:

1. 最容易被清掉的是empty process,空進(jìn)程是指那些沒(méi)有Activity與之綁定,也沒(méi)有任何應(yīng)用程序組件(如Services或者IntentReceiver)與之綁定的進(jìn)程,也就是說(shuō)在這個(gè)process中沒(méi)有任何activity或者service之類(lèi)的東西,它們僅僅是作為一個(gè)cache,在啟動(dòng)新的 Activity時(shí)可以提高速度。它們是會(huì)被優(yōu)先清掉的。因此建議,我們的后臺(tái)操作,***是作成Service的形式,也就是說(shuō)應(yīng)該在A(yíng)ctivity中啟動(dòng)一個(gè)Service去執(zhí)行這些操作。

2.接下來(lái)就是background activity了,也就是被stop掉了那些activity所處的process,那些不可見(jiàn)的Activity被清掉的確是安全的,系統(tǒng)維持著一個(gè) LRU列表,多個(gè)處于background的activity都在這里面,系統(tǒng)可以根據(jù)LRU列表判斷哪些activity是可以被清掉的,以及其中哪一個(gè)應(yīng)該是***被清掉。不過(guò),文檔中提到在這個(gè)已被清掉的Activity又被重新創(chuàng)建的時(shí)候,它的onCreate會(huì)被調(diào)用,參數(shù)就是onFreeze時(shí)的那個(gè)Bundle。不過(guò)這里有一點(diǎn)不明白的是,難道這個(gè)Activity被killed時(shí),Android會(huì)幫它保留著這個(gè)Bundle嗎?

3.然后就輪到service process了,這是一個(gè)與Service綁定的進(jìn)程,由startService方法啟動(dòng)。雖然它們不為用戶(hù)所見(jiàn),但一般是在處理一些長(zhǎng)時(shí)間的操作(例如MP3的播放),系統(tǒng)會(huì)保護(hù)它,除非真的沒(méi)有內(nèi)存可用了。

4.接著又輪到那些visible activity了,或者說(shuō)visible process。前面也談到這個(gè)情況,被Paused的Activity也是有可能會(huì)被系統(tǒng)清掉,不過(guò)相對(duì)來(lái)說(shuō),它已經(jīng)是處于一個(gè)比較安全的位置了。

5.最安全應(yīng)該就是那個(gè)foreground activity了,不到迫不得已它是不會(huì)被清掉的。這種process不僅包括resume之后的activity,也包括那些onReceiveIntent之后的IntentReceiver實(shí)例。

在A(yíng)ndroid Activity生命周期的討論中,文檔也提到了一些需要注意的事項(xiàng):因?yàn)锳ndroid應(yīng)用程序的生存期并不是由應(yīng)用本身直接控制的,而是由 Android系統(tǒng)平臺(tái)進(jìn)行管理的,所以,對(duì)于我們開(kāi)發(fā)者而言,需要了解不同的組件Activity、Service和IntentReceiver的生命,切記的是:如果組件的選擇不當(dāng),很有可能系統(tǒng)會(huì)殺掉一個(gè)正在進(jìn)行重要工作的進(jìn)程。

關(guān)于“Android中Activity的生命周期是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

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

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

AI