詳談Activity生命周期

activity生命周期

一、Activity的生命周期如上圖所示梧躺,一目了然:

1、onCreate:表示Activity正在被創(chuàng)建傲绣,在這里可以做一些初始化的操作掠哥,比如調(diào)用setContentView去加載界面布局資源、初始化Activity所需數(shù)據(jù)等斜筐。

2龙致、onStart:表示Activity正在被啟動,即將開始顷链,此時Activity已經(jīng)可見目代,但是還沒有出現(xiàn)在前臺,無法和用戶進行交互操作嗤练。

3榛了、onResume:此時Activity已經(jīng)出現(xiàn)在前臺可見,并且開始活動煞抬,可以和用戶進行操作霜大。

4、onPause:表示Activity正在停止革答,在這里不能做一些太耗時的操作战坤,因為從當前Activity去打開新的Activity時,先執(zhí)行當前Activity的onPause方法后才去創(chuàng)建新的Activity(onCreate -> onStart -> onResume)残拐,所以如果做了耗時的操作會影響新Activity的顯示途茫。

5、onStop:表示Activity即將停止溪食,從前臺進入后臺囊卜。

6、onDestroy:Acitvity即將被銷毀,在此可以做一些回收工作和釋放資源栅组。

7雀瓢、onRestart:表示Acitvity正在重新啟動。當Activity從前臺進入后臺(onPause -> onStop)后又從后臺進入前臺時調(diào)用此方法玉掸。比如用戶按下Home鍵或者打開新的Activity后又回到這個Activity刃麸。

二、Activity各生命周期方法的執(zhí)行情況:

1排截、第一次啟動Activity:onCreat -> onStart -> onResume;

2嫌蚤、用戶打開新的Activity或切換到桌面:onPause -> onStop;

注:如果新打開的Activity采用透明主題(之前的Activity還能看到),當前Activity不會回調(diào)onStop断傲;

3脱吱、用戶在此回到當前Activity時:onRestart -> onStart -> onResume;

4、用戶按下back鍵回退或調(diào)用finish時:onPause -> onStop -> onDestroy;

5认罩、從整個生命周期來說箱蝠,onCreat和onDestroy是配對的,分表標識著Activity的創(chuàng)建和銷毀垦垂,并且只有一次調(diào)用宦搬。從Activity是否可見來說,onStart和onStop是配對的劫拗,隨著用戶的操作或者設(shè)備屏幕的點亮和熄滅间校,著兩個方法可能被調(diào)用多次。從Activity是否在前臺來說页慷,onResume和onPause是配對的憔足,隨著用戶操作或者設(shè)備屏幕的點亮和熄滅,這兩個方法可能被多次調(diào)用酒繁。

6滓彰、假設(shè)當前Activity為A,此時用戶打開新的Activity B,他們的生命周期方法調(diào)用是怎樣的州袒?

A? onPause -> B onCreat -> B onStart -> B onResume -> A onStop

三揭绑、onSaveInstanceState 和 onRestoreInstanceState

上面講到的是正常情況下典型的Activity的生命周期,下面我們來看一下異常情況下的生命周期:

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

1)

比較常見的情況比如旋轉(zhuǎn)手機屏幕為了適配而加載不同分辨率的圖片他匪,鍵盤的顯示與隱藏,系統(tǒng)語言的改變夸研,系統(tǒng)會重新配置相關(guān)資源導(dǎo)致Activity被殺死并重新創(chuàng)建邦蜜。

當系統(tǒng)配置發(fā)生變化后Activity會被銷毀(onPause -> onStop -> onDestroy),同時由于Activity是在異常情況下終止的,系統(tǒng)會調(diào)用onSaveInstanceState來保存Activity當前狀態(tài)陈惰。這個方法的調(diào)用是在onStop之前,他和onPause沒有既定的時序關(guān)系,既可能在onPause之前也可能在onPause之后(這個方法只會出現(xiàn)在Activity異常終止的情況下抬闯,正常情況下系統(tǒng)不會回調(diào)這個方法)井辆。當Activity被重新創(chuàng)建后,系統(tǒng)會調(diào)用onRestoreInstanceState溶握,并且把Activity銷毀時onSaveInstanceState方法所保存的Bundle對象作為參數(shù)傳遞給onRestoreInstanceStae和onCreat,因此我們可以通過onRestoreInstanceState和onCreat方法來判斷Activity是否被重新創(chuàng)建了杯缺,如果被重建了,那么我們可以取出之前保存的數(shù)據(jù)并恢復(fù)睡榆。從時序上來說萍肆,onRestoreInstanceState的調(diào)用時機在onStart之后。

在onSaveInstanceState和onRestoreInstanceState方法中系統(tǒng)會自動做一些恢復(fù)的工作胀屿。當Activity在異常情況下需要重新創(chuàng)建時塘揣,系統(tǒng)會默認為我們保存當前Activity的視圖結(jié)構(gòu),并且在Activity重啟后為我們恢復(fù)這些數(shù)據(jù)宿崭,比如文本框中輸入的數(shù)據(jù)亲铡、listView滾動的位置等,葡兑,這些View相關(guān)的狀態(tài)系統(tǒng)都能夠默認為我們恢復(fù)奖蔓。

下面的例子來驗證我們自己做數(shù)據(jù)恢復(fù)和存儲情況:

在onSaveInstanceState中存儲一個字符串,然后當Activity被銷毀再重新創(chuàng)后我們再去獲取之前存儲的字符串讹堤。接收的位置可以選擇onRestoreInstanceState或者onCreat吆鹤,二者的區(qū)別是:onRestoreInstanceState一旦被調(diào)用,其參數(shù)Bundle savedInstanceState一定是有值的洲守,我們不用額外判斷是否為空疑务;但是onCreat如果是正常啟動的話,其參數(shù)Bundle savedInstanceState為null岖沛,所以必須要額外判斷暑始。這兩個方法我們?nèi)芜x一個都可以進行數(shù)據(jù)恢復(fù),但是官方文檔建議采用onRestoreInstanceState去恢復(fù)數(shù)據(jù)婴削。下面是運行時候的數(shù)據(jù):

注意:針對onSaveInstanceState方法有一點需要說明廊镜,系統(tǒng)只會在Activity即將被銷毀并且有機會重新顯示的情況下才會去調(diào)用他(系統(tǒng)只會在Activity異常終止的時候才會去調(diào)用onSaveInstanceState和onRestoreInstanceState來存儲和恢復(fù)數(shù)據(jù),其他情況不會觸發(fā)這個過程)唉俗。

2)

我們知道嗤朴,當系統(tǒng)配置發(fā)生改變后,Activity會被重新創(chuàng)建虫溜,那有沒有辦法不重新創(chuàng)建呢雹姊?答案是有的。系統(tǒng)配置中有很多內(nèi)容衡楞,如果某項內(nèi)容發(fā)生改變后我們不想讓Activity重新創(chuàng)建吱雏,可以給Activity指定configChanges屬性。比如不想讓Activity在屏幕旋轉(zhuǎn)的時候重新創(chuàng)建,就可以給configChanges屬性添加?orientation這個值:

如果想指定多個值歧杏,可以用“|”連接起來镰惦,比如 android:configChanges="orientantion|keybord"。系統(tǒng)配置中所含的項目非常多犬绒,下面只介紹幾個常用的項目:

a旺入、orientation:屏幕方向發(fā)生了改變,這個是最常用的凯力,比如旋轉(zhuǎn)了手機屏幕茵瘾;

b、keyboard:鍵盤類型發(fā)生了改變咐鹤,比如用戶使用了外插鍵盤拗秘;

c、keyBoardHidden:鍵盤的可訪問性發(fā)生了改變慷暂,比如用戶調(diào)出了鍵盤聘殖;

d、screenSize:當屏幕的尺寸信息發(fā)生了改變行瑞,當旋轉(zhuǎn)設(shè)備屏幕時奸腺,屏幕尺寸會發(fā)發(fā)生改變,這個選項比較特殊血久,他和編譯選項有關(guān)突照,當編譯選項中的minSdkVersion和targetSdkVersion均低于13時,此選項不會導(dǎo)致Activity重啟氧吐,否則會導(dǎo)致Activity重啟(API 13新添加)讹蘑。

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

這種情況下的數(shù)據(jù)存儲和恢復(fù)過程和情況 1?完全一致筑舅。Activity的優(yōu)先級從高到低可以分為三種:

a座慰、前臺Activity :正在和用戶交互的Activity,優(yōu)先級最高翠拣。

b版仔、可見但非前臺Activity:比如Activity中彈出了一個對話框,導(dǎo)致Activity可見但是位于后臺無法和用戶直接交互误墓。

c蛮粮、后臺Activity:已經(jīng)被暫停了的Activyti,比執(zhí)行了onStop谜慌,優(yōu)先級最低然想。

當系統(tǒng)內(nèi)存不足時,系統(tǒng)就會按照上述優(yōu)先級去殺死目標Activity所在的進程欣范,并在后續(xù)通過onSaveInstanceState和onRestoreInstanceState來存儲和恢復(fù)數(shù)據(jù)变泄。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末令哟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子妨蛹,更是在濱河造成了極大的恐慌励饵,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滑燃,死亡現(xiàn)場離奇詭異,居然都是意外死亡颓鲜,警方通過查閱死者的電腦和手機表窘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來甜滨,“玉大人乐严,你說我怎么就攤上這事∫履Γ” “怎么了昂验?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長艾扮。 經(jīng)常有香客問我既琴,道長,這世上最難降的妖魔是什么泡嘴? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任甫恩,我火速辦了婚禮,結(jié)果婚禮上酌予,老公的妹妹穿的比我還像新娘磺箕。我一直安慰自己,他們只是感情好抛虫,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布松靡。 她就那樣靜靜地躺著,像睡著了一般建椰。 火紅的嫁衣襯著肌膚如雪雕欺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天广凸,我揣著相機與錄音阅茶,去河邊找鬼。 笑死谅海,一個胖子當著我的面吹牛脸哀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扭吁,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼撞蜂,長吁一口氣:“原來是場噩夢啊……” “哼盲镶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蝌诡,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤溉贿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后浦旱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宇色,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年颁湖,在試婚紗的時候發(fā)現(xiàn)自己被綠了宣蠕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡甥捺,死狀恐怖抢蚀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情镰禾,我是刑警寧澤皿曲,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站吴侦,受9級特大地震影響屋休,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜备韧,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一博投、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盯蝴,春花似錦毅哗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至闽烙,卻和暖如春翅睛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背黑竞。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工捕发, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人很魂。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓扎酷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親遏匆。 傳聞我的和親對象是個殘疾皇子法挨,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

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