對(duì)于Android程序員來說,掌握活動(dòng)的生命周期非常重要,當(dāng)我們深入了解活動(dòng)的生命周期以后,才能寫出更流暢的APP,讓我們更好的去分配資源,讓應(yīng)用程序有更好的用戶體驗(yàn)。
我們首先來說一下,Android程序是用什么來管理活動(dòng)的。
Android使用任務(wù)(Task)來管理活動(dòng),一個(gè)任務(wù)就是一組存放在棧里的活動(dòng)的集合,這個(gè)棧也被稱作返回棧。那什么是棧呢?棧是一種后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu)。我的理解是,棧好比是一個(gè)容器,我們要依次往里面放置內(nèi)容物(數(shù)據(jù),Activity),而先放進(jìn)去的,我們是必須要把最上面的(最后放進(jìn)去的)先拿走,才能看到或者拿到。
默認(rèn)的情況下,當(dāng)我們啟動(dòng)一個(gè)新的Activity的時(shí)候,這個(gè)新啟動(dòng)的活動(dòng)就會(huì)被壓入返回棧中,處于棧的頂部,我們只能看到處于棧頂?shù)倪@個(gè)活動(dòng),當(dāng)我們按下Back返回鍵或者Finish()掉當(dāng)前棧頂?shù)幕顒?dòng)時(shí),它就會(huì)退出棧頂,之前被放入的活動(dòng)(沒有被Finish()掉)就會(huì)成為棧頂元素,呈現(xiàn)在我們面前。下面我們用一幅圖來說明這個(gè)問題。
看完棧,我們?cè)倏匆幌禄顒?dòng)的狀態(tài)?!禔ndroid第一行代碼》(郭霖著)中說,活動(dòng)在其生命周期中最多可能會(huì)有四種狀態(tài):
運(yùn)行狀態(tài):當(dāng)活動(dòng)位于棧頂時(shí),就處于運(yùn)行狀態(tài),系統(tǒng)最不愿意回收這樣的活動(dòng),回收會(huì)導(dǎo)致很差的用戶體驗(yàn)。個(gè)人認(rèn)為就是程序閃退,崩潰等。
暫停狀態(tài):當(dāng)活動(dòng)不再處于棧頂,但是對(duì)用戶依然可見時(shí)。不是說在棧頂?shù)脑夭艑?duì)用戶可見嗎?這是因?yàn)椴皇敲恳粋€(gè)活動(dòng)都是覆蓋整個(gè)屏幕的,一些對(duì)話框形式的活動(dòng)就只會(huì)占用一部分而已,比如Dialog。系統(tǒng)也是不愿意回收處于暫停狀態(tài)的活動(dòng)的,除非在萬不得已的情況下。
停止?fàn)顟B(tài):活動(dòng)不再處于棧頂,并且完全不可見的時(shí)候,就會(huì)處于停止?fàn)顟B(tài)。但系統(tǒng)會(huì)保存相應(yīng)的狀態(tài)和變量,但是當(dāng)內(nèi)存不足時(shí),還是會(huì)回收這一類的活動(dòng)的。
銷毀狀態(tài):當(dāng)活動(dòng)從棧中移除以后就變成了銷毀狀態(tài)。系統(tǒng)最樂意回收這類活動(dòng),以此來保證充足的內(nèi)存。
我們?cè)賮碛脤?shí)際的例子來看一下活動(dòng)的生存期以及生存期的轉(zhuǎn)換。我會(huì)新建一個(gè)工程,用打印日志的方式來展示這種轉(zhuǎn)換。先看一下經(jīng)典的活動(dòng)生命周期圖。
下面來用實(shí)例展示
新建一個(gè)Android工程,啟動(dòng)的Activity我起名為FirstActivity,然后新建另外兩個(gè)Activity,SecondActivity和ThirdActivity。(詳情見附圖)
然后為每個(gè)Activity重寫它們的生命周期的方法,并且在方法里面打印Activity所處的狀態(tài)。打印的時(shí)候,我們統(tǒng)一在打印的信息前加上字符串“Test-”,這樣就可以在控制臺(tái)里面清楚的看到執(zhí)行不同的操作時(shí),全部的活動(dòng)執(zhí)行生命周期的順序。(附圖)
然后我們?cè)诿總€(gè)活動(dòng)的Layout上面添加一個(gè)文本控件和一個(gè)按鈕,用來跳轉(zhuǎn)。
從第一個(gè)活動(dòng)跳轉(zhuǎn)到第二個(gè)活動(dòng)時(shí),我們只是跳轉(zhuǎn),不讓第一個(gè)活動(dòng)finish()掉,但是從第二個(gè)跳轉(zhuǎn)到第三個(gè)時(shí),我們讓第二個(gè)活動(dòng)finish()掉,下面我們來看一下活動(dòng)的生命周期是怎么執(zhí)行的。
1.啟動(dòng)程序,然后退出
2.啟動(dòng)程序,點(diǎn)擊按鈕跳轉(zhuǎn)到SecondActivity
3.接著從SecondActivity跳轉(zhuǎn)到ThirdActivity
4.在ThirdActivity中,點(diǎn)擊物理的返回按鈕
5.按Home鍵
其他不同的情況請(qǐng)自行探索。
好啦,今天就到此為止啦。