日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

activity 生命周期_从0系统学Android-2.4 Activity 的生命周期

發(fā)布時(shí)間:2024/9/30 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 activity 生命周期_从0系统学Android-2.4 Activity 的生命周期 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

更多內(nèi)容:更多精品文章分類

本系列持續(xù)更新中….

2.4 Activity 的生命周期

掌握 Activity 的生命周期對(duì)于開發(fā)者來說是非常重要的!

2.4.1 返回棧

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

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

棧是一種后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),默認(rèn)情況下,每當(dāng)我們啟動(dòng)一個(gè)新的 Activity,這個(gè) Activity 就會(huì)在返回棧中入棧,并且處于棧頂?shù)奈恢谩C慨?dāng)我們按下 Back 鍵或者調(diào)用 finish 方法后就會(huì)銷毀一個(gè) Activity。處于棧頂?shù)腁ctivity 就會(huì)出棧,這是前一個(gè)入棧的 Activity 就會(huì)重新處于棧頂?shù)奈恢?。系統(tǒng)總是會(huì)顯示處于棧頂?shù)?Activity 給用戶。

2.4.2 Activity 狀態(tài)

每個(gè) Activity 在其生命周期中最多有 4 種狀態(tài)。

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

當(dāng)一個(gè) Activity 處于返回棧的棧頂?shù)臅r(shí)候,這個(gè)時(shí)候的 Activity 就是運(yùn)行狀態(tài)。系統(tǒng)是最不愿意回收這種狀態(tài)的 Activity 的。

2.暫停狀態(tài)

當(dāng)一個(gè) Activity 不處于棧頂狀態(tài)但是仍然可見的時(shí)候,這種狀態(tài)稱為暫停狀態(tài)。不處于棧頂仍然可見是因?yàn)楹芏?Activity 不一定是占滿全屏的,比如對(duì)話框形式的 Activity。這種狀態(tài)的 Activity 系統(tǒng)也是不愿意回收的,除非內(nèi)存極低的情況。

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

當(dāng) Activity 不處于棧頂狀態(tài)并且不可見的時(shí)候,這種狀態(tài)稱為停止?fàn)顟B(tài)。這種狀態(tài)下系統(tǒng)仍然會(huì)保留 Activity 的相應(yīng)狀態(tài)和變量。但是當(dāng)內(nèi)存不太足,也是可能會(huì)被回收的。

4.銷毀狀態(tài)

Activity 從棧中移除,這個(gè)時(shí)候就稱為銷毀狀態(tài)。系統(tǒng)最傾向回收銷毀狀態(tài)的 Activity,從而保證內(nèi)存充足。

2.4.3 Activity 的生存期

Activity 中定義了 7 個(gè)回調(diào)方法,覆蓋了聲明周期的每一個(gè)環(huán)節(jié)。

onCreate()

Activity 第一次被創(chuàng)建的時(shí)候調(diào)用。應(yīng)該在這個(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()

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

onStop()

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

onDestroy()

這個(gè)方法在 Activity 被銷毀 前 調(diào)用,之后 Activity 的狀態(tài)就處于銷毀狀態(tài)。

onRestart()

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

以上的 7 個(gè)方法除了 onRestart() 方法外,其余的都是兩兩相對(duì),從而又將 Activity 分為 3 對(duì)生存期。

完整生存期

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

可見生存期

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

前臺(tái)生存期

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

2.4.4 體驗(yàn) Activity 的生命周期

上面主要是理論的知識(shí),下面從實(shí)戰(zhàn)方向出發(fā),去體驗(yàn)一下 Activity 的生命周期。

這里新建一個(gè)項(xiàng)目,項(xiàng)目中有兩個(gè) Activity ,一個(gè)是普通的 Activity ,一個(gè)是對(duì)話框式的 Activity。體現(xiàn)對(duì)話框式的 Activity 就是要修改一下這個(gè) Activity 的樣式。在 AndroidManifest.xml 的 Activity 標(biāo)簽配置中

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

就是通過 android:theme 屬性來設(shè)置。Android 系統(tǒng)內(nèi)置了很多的主題可以選擇。

MainActivity 中有兩個(gè)按鈕,第一個(gè)按鈕啟動(dòng) NormalActivity ,第二個(gè)按鈕啟動(dòng) DialogActivity。

下面啟動(dòng) MainActivity,這個(gè)時(shí)候的打印信息是:

MainActivity:onCreate MainActivity:onStart MainActivity:onResume

然后點(diǎn)擊第一個(gè)按鈕啟動(dòng) NormalActivity,打印信息:

MainActivity:onPause MainActivity:onStop

由于 NormalActivity 已經(jīng)把 MainActivity 徹底遮擋住了,因此 onPause 和 onStop 方法都執(zhí)行。

然后按下 Back 鍵,返回到 MainActivity ,打印信息:

MainActivity:onRestart MainActivity:onStart MainActivity:onResume

由于之前 MainActivity 已經(jīng)進(jìn)入了停止?fàn)顟B(tài),所以 onRestart 方法會(huì)得到執(zhí)行。

點(diǎn)擊第二個(gè)按鈕,啟動(dòng) DialogActivity,此時(shí)打印信息:

MainActivity:onPause

onStop 方法并沒有執(zhí)行,這是因?yàn)?DialogActivity 并沒有完全遮蓋住 MainActivity,此時(shí) MainActivity 只是進(jìn)入了暫停狀態(tài),并沒有進(jìn)入停止?fàn)顟B(tài)。

2.4.5 Activity 被回收了怎么辦?

一個(gè) Activity 在進(jìn)入了停止?fàn)顟B(tài)后,就有可能會(huì)被系統(tǒng)回收。

比如:應(yīng)用中有一個(gè) Activity A,用戶在 A 的基礎(chǔ)上啟動(dòng)了 Activity B ,這個(gè)時(shí)候 A 進(jìn)入了停止?fàn)顟B(tài),由于系統(tǒng)內(nèi)存不足,A 被回收了。然后用戶按下了 Back 鍵返回 A 。這個(gè)時(shí)候會(huì)出現(xiàn)什么問題呢?

其實(shí) A 會(huì)正常顯示,只不過不會(huì)執(zhí)行 onRestart 方法了,而是會(huì)執(zhí)行 onCreate 方法。重新創(chuàng)建一次。那么之前的狀態(tài)就全沒有了。

這個(gè)時(shí)候 onSaveInstanceState() 方法排上用場(chǎng)了,這個(gè)方法可以保證在 Activity 被回收前一定會(huì)被調(diào)用,因此我們可以通過這個(gè)方法來保存 Activity 被回收前的狀態(tài)數(shù)據(jù)。

@Override protected void onSaveInstanceState(Bundle outState){super.onSaveInstanceState(Bundle outState);String tempData = "要保存的狀態(tài)";outState.putString("data",tempData); }

數(shù)據(jù)保存下來了,然后我們就可以通過 onCreate() 方法中的參數(shù)來獲取里面的數(shù)據(jù)了。

總結(jié)

以上是生活随笔為你收集整理的activity 生命周期_从0系统学Android-2.4 Activity 的生命周期的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。