Activity的生命周期

??????? 本文將Activity的生命周期分為兩部分內(nèi)容,一部分是典型情況下的生命周期牡属,另一部分是異常情況下的生命周期票堵。所謂典型是指用戶參與的情況下扼睬,Activity所經(jīng)過的生命周期的改變逮栅。而異常情況是Activity被系統(tǒng)回收或由于當(dāng)前設(shè)備的Configuration發(fā)生改變而導(dǎo)致Activity被銷毀重建,這兩種情況略有不同需要另做分析窗宇。

??????? 典型情況下的生命周期分析

正常情況下Activity會(huì)經(jīng)過以下生命周期

(1)onCreate:表示Activity正在被創(chuàng)建措伐,這是生命周期的第一個(gè)方法。在這個(gè)方法中军俊,我們可以做一些初始化工作赞厕,比如調(diào)用setContentView去加載頁面資源大猛、初始化Activity需要的數(shù)據(jù)等。

(2)onRestart:表示Activity正在重新啟動(dòng)。一般情況下刮便,當(dāng)當(dāng)前的Activity從不可見變?yōu)榭梢姞顟B(tài)時(shí),onResraet()方法就會(huì)被調(diào)用椭住。比如用戶按Home鍵切換到桌面支竹,或用戶打開了一個(gè)新的Activity,這時(shí)當(dāng)前的Activity就會(huì)被暫停,也就是onPause和onStop被執(zhí)行了泳唠,接著用戶又回到了這個(gè)Activity狈网,就會(huì)出現(xiàn)這種情況。

(3)onStart:表示Activity正在被啟動(dòng),即將開始拓哺,此時(shí)Activity已經(jīng)可見了勇垛,但還未出現(xiàn)在前臺(tái),還無法與用戶交互士鸥。這時(shí)可以理解Activity已經(jīng)顯示出來了闲孤,但我們還看不見。

(4)onResume:表示Activity已經(jīng)可見了础淤,并且出現(xiàn)在前臺(tái)開始活動(dòng)了崭放,onStart與onResume都表示Activity可見,它們區(qū)別在于鸽凶,onStart時(shí)Activity還在后臺(tái)币砂,onResume時(shí)Activity才顯示在前臺(tái)。

(5)onPause:表示Activity正在停止玻侥,正常情況下决摧,緊接著onStop就會(huì)被調(diào)用。在特殊情況下凑兰,如果這個(gè)時(shí)候在快速的回到當(dāng)前的Activity掌桩,那么OnResume就會(huì)被調(diào)用。當(dāng)然這屬于極端情況姑食,用戶操作很難重現(xiàn)這一場(chǎng)景波岛。此時(shí)可以做一些存儲(chǔ)數(shù)據(jù)、停止動(dòng)畫等工作音半,但是注意不能太耗時(shí)则拷,因?yàn)檫@會(huì)影響新Activity的顯示,onPause必須先執(zhí)行曹鸠,新Activity的OnResume才能被執(zhí)行煌茬。

(6)onStop:表示Activity即將停止,可以做一些稍微重量級(jí)的回收工作彻桃,同樣不能太耗時(shí)坛善。

(7)onDestroy:表示Activity即將被銷毀,這是Activity生命周期的最后一次回調(diào)邻眷。在這里眠屎,我們可以做一些回收工作和最終資源釋放。

正常境況下肆饶,Activity的生命周期只有以上7個(gè)改衩,下圖詳細(xì)描述了Activity各種生命周期的切換過程。


Activity生命周期的切換過程

(1)針對(duì)一個(gè)特定的Activity抖拴,第一次啟動(dòng)燎字,回調(diào)如下:onCreate->onStart->onResume腥椒。

(2)當(dāng)用戶打開新的Activity或者切換到桌面時(shí),回調(diào)如下:onPause->onStop候衍。這里有一種特殊情況笼蛛,如果新的Activity采用了透明主題,那么當(dāng)前的Activity不會(huì)回調(diào)onStop蛉鹿。

(3)當(dāng)用戶再回到原Activity時(shí)滨砍,回調(diào)如下:onRestart->onStart->onResume。

(4)當(dāng)用戶按back鍵回退時(shí)妖异,回調(diào)如下:onPause->onStop->onDestroy惋戏。

(5)當(dāng)Activity被系統(tǒng)回收后再次打開,生命周期方法回調(diào)過程和(1)一樣他膳,注意只是生命周期方法一樣响逢,不代表所有過程都一樣。

(6)從整個(gè)生命周期來說棕孙,onDestroy和onCreate是配對(duì)的舔亭,分別標(biāo)識(shí)Activity的重建和銷毀,并且只可能有一次調(diào)用蟀俊。從Activity是否可見來說钦铺,onStart和onStop是配對(duì)的,隨著用戶的操作和設(shè)備屏幕的點(diǎn)亮和熄滅肢预,這兩個(gè)方法可能會(huì)多次被調(diào)用矛洞;從Activity是否在前臺(tái)來說,onResume和onPause是配對(duì)的烫映,隨著用戶的操作和設(shè)備屏幕的點(diǎn)亮和熄滅沼本,這兩個(gè)方法可能會(huì)多次被調(diào)用;

????????????????????? 異常情況下的生命周期分析

Activity除了受用戶操作而導(dǎo)致的正常生命周期調(diào)度窑邦,還有一些異常情況擅威,比如當(dāng)資源相關(guān)的系統(tǒng)配置發(fā)生改變以及系統(tǒng)內(nèi)存不足時(shí)壕探,Activity就有可能被殺死冈钦。

(1)資源相關(guān)的系統(tǒng)配置發(fā)生改變導(dǎo)致Activity被殺死并被重新創(chuàng)建

比如說橫屏手機(jī)和豎屏手機(jī)就會(huì)拿到兩張不同的圖片(設(shè)定了landscape或portrait狀態(tài)下的圖片)。比如說當(dāng)前Activity處于豎屏狀態(tài)李请,如果突然旋轉(zhuǎn)屏幕瞧筛,由于系統(tǒng)配置發(fā)生改變,在默認(rèn)的情況下导盅,Activity就會(huì)被銷毀并且重建较幌,當(dāng)然我們也可以阻止系統(tǒng)重新創(chuàng)建Activity。

在默認(rèn)的情況下白翻,如果我們的Activity不做特殊處理乍炉,那么當(dāng)系統(tǒng)配置改變后绢片,Activity就會(huì)被銷毀重建。如下圖所示岛琼。


異常情況下Activity的重建過程

當(dāng)系統(tǒng)配置發(fā)生改變后底循,Activity會(huì)被銷毀,其onPause槐瑞,onStop熙涤,onDestroy均會(huì)被調(diào)用,同時(shí)由于Activity是在異常情況下終止的困檩,系統(tǒng)會(huì)調(diào)用onSaveInstanceState來保存當(dāng)前Activity的狀態(tài)祠挫。這個(gè)方法在onStop前被調(diào)用,但和onPause沒有既定的時(shí)序關(guān)系悼沿。特別的是等舔,這個(gè)方法只會(huì)在Activity被異常終止的情況下,正常情況下系統(tǒng)不會(huì)回調(diào)這個(gè)方法糟趾。當(dāng)Activity被重新創(chuàng)建后软瞎,系統(tǒng)會(huì)調(diào)用onRestoreInstanceState,并且把Activity銷毀時(shí)onSaveInstanceState保存的Bundle對(duì)象作為參數(shù)傳遞給onRestoreInstanceState和onCreate來判斷Activity是否被重建了拉讯,如果被重建了涤浇,那么我們就取出之前保存的數(shù)據(jù)并恢復(fù),從時(shí)序上魔慷,onRestoreInstanceState的調(diào)用時(shí)序在onStart之后只锭。

(2)資源內(nèi)存不足導(dǎo)致低優(yōu)先級(jí)的Activity被殺死

Activity按照優(yōu)先級(jí)從高到低,可以分為以下三種:

(1)前臺(tái) Activity——正在與用戶交互的Activity院尔,優(yōu)先級(jí)最高蜻展。

(2)可見但非前臺(tái)Activity——比如Activity中彈出來一個(gè)對(duì)話框,導(dǎo)致Activity可見邀摆,但是位于后臺(tái)無法與用戶進(jìn)行交互纵顾。

(3)后臺(tái)Activity——已經(jīng)被暫停的Activity,比如已經(jīng)執(zhí)行了onStop栋盹,優(yōu)先級(jí)最低施逾。

當(dāng)系統(tǒng)內(nèi)存不足時(shí),系統(tǒng)就會(huì)按照上述優(yōu)先級(jí)去殺死目標(biāo)Activity所在的進(jìn)程例获,并在后續(xù)通過onSaveInstanceState和onRestoreInstanceState進(jìn)行存儲(chǔ)和恢復(fù)數(shù)據(jù)汉额。如果一個(gè)進(jìn)程沒有四大組件在執(zhí)行,那么這個(gè)進(jìn)程就會(huì)很快被殺死榨汤,因此一些后臺(tái)工作不適合脫離四大組件而獨(dú)自運(yùn)行在后臺(tái)蠕搜,這樣的進(jìn)程很快就會(huì)被殺死。比較好的方法就是把進(jìn)程加入到Service從而保證進(jìn)程有一定的優(yōu)先級(jí)收壕,這樣就不會(huì)被系統(tǒng)輕易地殺死了妓灌。

如果我們不想系統(tǒng)從新創(chuàng)建Activity轨蛤,可以給Activity指定configChanges屬性。比如不想讓Activity在屏幕旋轉(zhuǎn)時(shí)候重新創(chuàng)建虫埂,可以在AndroidMenifest.xml加入Activity的聲明即可:android:configChanges=“orientation|screenSize”

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末俱萍,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子告丢,更是在濱河造成了極大的恐慌枪蘑,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岖免,死亡現(xiàn)場(chǎng)離奇詭異岳颇,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)颅湘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門话侧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人闯参,你說我怎么就攤上這事瞻鹏。” “怎么了鹿寨?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵新博,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我脚草,道長(zhǎng)赫悄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任馏慨,我火速辦了婚禮埂淮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘写隶。我一直安慰自己倔撞,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布慕趴。 她就那樣靜靜地躺著痪蝇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪秩贰。 梳的紋絲不亂的頭發(fā)上霹俺,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天柔吼,我揣著相機(jī)與錄音毒费,去河邊找鬼。 笑死愈魏,一個(gè)胖子當(dāng)著我的面吹牛觅玻,可吹牛的內(nèi)容都是我干的想际。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼溪厘,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼胡本!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起畸悬,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤侧甫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蹋宦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體披粟,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年冷冗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了守屉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蒿辙,死狀恐怖拇泛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情思灌,我是刑警寧澤俺叭,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站泰偿,受9級(jí)特大地震影響绪颖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜甜奄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一柠横、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧课兄,春花似錦牍氛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蜒茄,卻和暖如春唉擂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背檀葛。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國打工玩祟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人屿聋。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓空扎,卻偏偏與公主長(zhǎng)得像藏鹊,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子转锈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

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

  • 啟動(dòng)與銷毀Activity 不同于使用 main() 方法啟動(dòng)應(yīng)用的其他編程范例盘寡,Android 系統(tǒng)會(huì)通過調(diào)用對(duì)...
    安卓Boy閱讀 1,775評(píng)論 3 5
  • 您的應(yīng)用中的Activity應(yīng)該做到如下需求: 1.用戶在使用應(yīng)用時(shí)接聽來電或切換到另一個(gè)應(yīng)用,它不會(huì)崩潰撮慨。 2....
    正陽Android閱讀 530評(píng)論 1 0
  • 這是我第三遍看《Android開發(fā)藝術(shù)探索》這本書了竿痰,從第一遍看的云里霧里,第二遍略微明白之后砌溺,我決定看第三遍菇曲,并...
    陳添閱讀 863評(píng)論 2 8
  • 一本android開發(fā)程序員必讀的一本書,感謝任玉剛大佬的分享 一抚吠、Activity的生命周期全面分析 典型情況下...
    kongjn閱讀 544評(píng)論 1 3
  • 一.Activity的方法的介紹 onCreate : 該方法是在Activity被創(chuàng)建時(shí)回調(diào)常潮,它是生命周期第一個(gè)...
    冷門555閱讀 432評(píng)論 0 0