一、activity生命周期分析
1.1正常情況下的生命周期
(1)onCreate:表示Activity正在被創(chuàng)建,通常情況下我們會(huì)在這個(gè)方法里面做一些初始化資源的操作,比如setContentView加載布局以初始化一些數(shù)據(jù)的操作等。
(2)onRestart:表示Activity正在重新啟動(dòng),通常情況下沛贪,是當(dāng)前activity從不可見到可見的時(shí)候,會(huì)調(diào)用onrestart震贵,一般情況下這三種情況下會(huì)調(diào)用onrestart
? ?1)按下home鍵之后利赋,然后切換回來,會(huì)調(diào)用onRestart()屏歹。
? ?2)從本Activity跳轉(zhuǎn)到另一個(gè)Activity之后隐砸,按back鍵返回原來Activity,會(huì)調(diào)用onRestart()蝙眶;
? ?3)從本Activity切換到其他的應(yīng)用季希,然后再從其他應(yīng)用切換回來,會(huì)調(diào)用onRestart()幽纷;
(3)onStart:表示Activity正在被啟動(dòng)式塌,這個(gè)時(shí)候的Activity已經(jīng)可見了,只不過還沒有出現(xiàn)在前臺(tái)友浸,無法和用戶進(jìn)行交互峰尝。所以你可以理解成,activity已經(jīng)顯示了但是我們還看不到收恢。
(4)onResume:表示Activity已經(jīng)可見了武学,并且已經(jīng)出現(xiàn)在前臺(tái),并可以進(jìn)行交互了伦意,大家要注意的一點(diǎn)是火窒,onStart和onResume都表示Activity可見,但是onStart的時(shí)候還在后臺(tái)驮肉,onResume的時(shí)候才顯示在前臺(tái)熏矿。
(5)onPause:表示Activity正在被停止,正常情況下會(huì)緊接著調(diào)用onStop方法离钝,但是特殊情況下票编,你快速返回當(dāng)前Activity的話就會(huì)調(diào)用onResume。在這個(gè)方法可以做一些不要太耗時(shí)的操作卵渴,最好在這個(gè)方法做一些數(shù)據(jù)存儲(chǔ)慧域,還有動(dòng)畫停止的操作,如果太耗時(shí)會(huì)影響到Activity的顯示浪读,因?yàn)檫@個(gè)方法執(zhí)行完以后才會(huì)去調(diào)用新Activity的onResume方法吊趾。
(6)onStop:表示Activity即將停止宛裕,同樣的也不要太耗時(shí),適合做一些輕量級(jí)的回收工作论泛。
(7)onDestroy:表示Activity即將被摧毀,這是最后一個(gè)生命周期的回調(diào)蛹屿,我們可以做一些回收工作和最終的資源釋放屁奏。
在正常的情況下,生命周期就這上面七個(gè)错负,為了讓大家更好的理解坟瓢,特此摳圖一張,供大家理解
這里對(duì)上面圖片補(bǔ)充幾點(diǎn):
(1)針對(duì)一些特定的Activity犹撒,第一次啟動(dòng)折联,回調(diào)如下:onCreate-onStart-onResume。
(2)當(dāng)用戶打開了新的Activity或者按Home返回了桌面的話识颊,回調(diào)如下:onPause-onStop诚镰,這里有一種特殊的情況,如果新的那個(gè)Activity采用了透明主題的話祥款,那這個(gè)Activity不會(huì)返回onStop方法清笨。
(3)當(dāng)用戶返回當(dāng)前Activity時(shí),回調(diào)如下:onRestart-onStart-onResume刃跛。
(4)用用戶按back鍵的時(shí)候抠艾,回調(diào)如下:onPause-onStop-onDestory。
1.2 上面說了下正常下得生命周期桨昙,下面講講異常情況下
(1)資源相關(guān)的系統(tǒng)配置發(fā)生改變導(dǎo)致Activity被殺死并且重建
舉個(gè)栗子检号,橫屏和豎屏就會(huì)拿到兩張不同的圖片,在豎屏的情況下蛙酪,突然切換到橫屏齐苛,因?yàn)橄到y(tǒng)配置發(fā)生了改變,在默認(rèn)的情況下滤否,Activity就會(huì)銷毀并重建(這里說的是默認(rèn)情況)脸狸,其生命周期如下
當(dāng)系統(tǒng)配置發(fā)生改變后,Activity會(huì)被銷毀藐俺,回調(diào)如下:onPause-onStop-onDestory炊甲,
由于Activity是在異常情況下被終止的,所以系統(tǒng)會(huì)調(diào)用onSaveInstanceState方法來保存當(dāng)前Activity的狀態(tài)欲芹,這個(gè)方法會(huì)在onStop之前調(diào)用卿啡,不過和onPause方法沒有既定的順序,有可能在onPause之前也有可能在onPause之后菱父。強(qiáng)調(diào)一點(diǎn)颈娜,這個(gè)方法只會(huì)在異常情況下才會(huì)調(diào)用剑逃,正常情況下不會(huì)調(diào)用這個(gè)方法。當(dāng)Activity被重新創(chuàng)建后官辽,系統(tǒng)會(huì)調(diào)用OnRestoreInstanceState方法蛹磺,并把onSaveInstanceState保存的Bundle對(duì)象傳遞到OnRestoreInstanceState方法中。同時(shí)要知道的時(shí)同仆,在onSaveInstanceState和OnRestoreInstanceState方法中萤捆,系統(tǒng)為我們做了一定的恢復(fù)工作,比如說俗批,當(dāng)前Activity的視圖結(jié)構(gòu)俗或,輸入框的數(shù)值,Listview的滾動(dòng)位置等等岁忘,這些View相關(guān)的狀態(tài)系統(tǒng)都能為我們恢復(fù)辛慰。
(2)資源內(nèi)存不足,導(dǎo)致低優(yōu)先級(jí)Activity被殺死
這種情況不好模擬干像,但是數(shù)據(jù)儲(chǔ)存和恢復(fù)和(1)是一致的帅腌,我在這里講一下優(yōu)先級(jí),Activity會(huì)按照優(yōu)先級(jí)情況蝠筑,分為3種:
1)前臺(tái)Activity——正在和用戶交互的Activity優(yōu)先級(jí)別最高狞膘。
2)可見但非前臺(tái)Activity——如當(dāng)前Activity彈出了一個(gè)Dialog框,這個(gè)Activity就處于可見但不可交互什乙。
3)后臺(tái)Activity——被暫停的Activity挽封,比如執(zhí)行了onStop,優(yōu)先級(jí)最低臣镣。
資源不足的時(shí)候辅愿,系統(tǒng)會(huì)按上述優(yōu)先級(jí)去殺死優(yōu)先級(jí)最低的Activity所在的進(jìn)程。并在后續(xù)通過onSaveInstanceState和OnRestoreInstanceState來存儲(chǔ)和恢復(fù)數(shù)據(jù)忆某。
二点待、Activity的四種啟動(dòng)模式
Activity有四種啟動(dòng)模式,分別是:standrad弃舒、singleTop癞埠、singleTask、singleInstance我們下面來詳細(xì)介紹
(1)standrad:標(biāo)準(zhǔn)模式聋呢,這是系統(tǒng)默認(rèn)的模式苗踪。這個(gè)模式呢,每啟動(dòng)一個(gè)Activity就會(huì)創(chuàng)建一個(gè)新的實(shí)例削锰,不管這個(gè)實(shí)例是否存在通铲。這是典型的多實(shí)例實(shí)現(xiàn),一個(gè)任務(wù)棧中可以有多個(gè)實(shí)例器贩,每個(gè)實(shí)例也可以屬于不同的棧颅夺。舉個(gè)栗子:Activity A啟動(dòng)Activity B(B是標(biāo)準(zhǔn)模式)朋截,那么B就會(huì)進(jìn)入到A的棧里面。
(2)singleTop:棧頂復(fù)用模式吧黄,這個(gè)模式呢部服,只要Activity位于任務(wù)棧的棧頂就不會(huì)被重新創(chuàng)建。相反如果不在棧頂就會(huì)被重新創(chuàng)建稚字。舉個(gè)栗子:在一個(gè)棧里面有四個(gè)實(shí)例 A B C D A在棧底饲宿,D在棧頂,D的啟動(dòng)模式為singleTop胆描,那么假設(shè)啟動(dòng)D那么棧內(nèi)的情況不變,如果D的啟動(dòng)模式為standrad的話仗阅,那么D就會(huì)被重建棧內(nèi)就會(huì)變成ABCDD了昌讲。
(3)singleTask:棧內(nèi)復(fù)用模式。這是一種單實(shí)例模式减噪,在這種模式下短绸,只要Activity在一個(gè)棧中存在,那么多次啟動(dòng)該Activity都不會(huì)重新創(chuàng)建一個(gè)實(shí)例筹裕。具體一點(diǎn)就是醋闭,當(dāng)一個(gè)singleTask模式的Activity啟動(dòng)后,系統(tǒng)首先會(huì)查找是否存在該Activity想要的棧朝卒,如果不存在证逻,就重新創(chuàng)建一個(gè)棧在創(chuàng)建一個(gè)Activity實(shí)例把Activity放進(jìn)去,如果存在那么就把該Activity調(diào)到棧頂抗斤,如果實(shí)例不存在就會(huì)創(chuàng)建該Activity的實(shí)例并放入棧中囚企。
(4)singleInstance:?jiǎn)螌?shí)例模式。這是singleTask的加強(qiáng)版瑞眼,他除了具有singleTask所有的特性外龙宏,還加強(qiáng)了一點(diǎn),那就是具有此模式的實(shí)例伤疙,只能單獨(dú)存在于一個(gè)棧中银酗,換句話說就是A啟動(dòng)后會(huì)為A單獨(dú)創(chuàng)建一個(gè)棧,A獨(dú)立存在于這個(gè)棧中徒像,由于棧的復(fù)用黍特,后續(xù)的啟動(dòng)都不會(huì)重新創(chuàng)建實(shí)例。
好啦厨姚,啟動(dòng)模式就講完了衅澈,那么我說一下啟動(dòng)模式指定呢
有兩種方式,一種是在AndroidMenifest為Activity指定啟動(dòng)模式谬墙,如圖:
另一種是通過Intent在設(shè)置標(biāo)志位來為Activity設(shè)置啟動(dòng)模式今布,如圖:
這兩種方式都可以為Activity設(shè)置啟動(dòng)模式经备,不過兩者還是有區(qū)別的,通過優(yōu)先級(jí)來講部默,第二種優(yōu)先級(jí)比第一種高侵蒙,兩種都存在,以第二種為準(zhǔn)傅蹂。
其次兩者在范圍也有不同纷闺,第一種不能設(shè)置FLAG_ACTIVITY_CLEAR_TOP標(biāo)識(shí),第二種無法為Activity指定singleInstance模式份蝴。
好啦Activity的生命周期和啟動(dòng)模式就講到這里了犁功,講的很基礎(chǔ),第一次開始寫就先從基本的開始吧婚夫。