Activity生命周期和啟動(dòng)模式

一、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ǔ),第一次開始寫就先從基本的開始吧婚夫。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末浸卦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子案糙,更是在濱河造成了極大的恐慌限嫌,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件时捌,死亡現(xiàn)場(chǎng)離奇詭異怒医,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)奢讨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門稚叹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人禽笑,你說我怎么就攤上這事入录。” “怎么了佳镜?”我有些...
    開封第一講書人閱讀 169,589評(píng)論 0 363
  • 文/不壞的土叔 我叫張陵僚稿,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么癞谒? 我笑而不...
    開封第一講書人閱讀 60,188評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮蠢络,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘迟蜜。我一直安慰自己刹孔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評(píng)論 6 398
  • 文/花漫 我一把揭開白布娜睛。 她就那樣靜靜地躺著髓霞,像睡著了一般卦睹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上方库,一...
    開封第一講書人閱讀 52,785評(píng)論 1 314
  • 那天结序,我揣著相機(jī)與錄音,去河邊找鬼纵潦。 笑死徐鹤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的邀层。 我是一名探鬼主播返敬,決...
    沈念sama閱讀 41,220評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼寥院!你這毒婦竟也來了救赐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,167評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤只磷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后泌绣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钮追,經(jīng)...
    沈念sama閱讀 46,698評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評(píng)論 3 343
  • 正文 我和宋清朗相戀三年阿迈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了元媚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,912評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡苗沧,死狀恐怖刊棕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情待逞,我是刑警寧澤甥角,帶...
    沈念sama閱讀 36,572評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站识樱,受9級(jí)特大地震影響嗤无,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜怜庸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評(píng)論 3 336
  • 文/蒙蒙 一当犯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧割疾,春花似錦嚎卫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽侵佃。三九已至,卻和暖如春恰响,著一層夾襖步出監(jiān)牢的瞬間趣钱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工胚宦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留首有,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,359評(píng)論 3 379
  • 正文 我出身青樓枢劝,卻偏偏與公主長(zhǎng)得像井联,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子您旁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容