Activity異常情況下的生命周期

既然是探究Activity異常情況下的生命周期叹坦,首先就得搞明白Activity在哪些情況下會(huì)出現(xiàn)異常情況。在實(shí)際的開(kāi)發(fā)過(guò)程中卑雁,我們經(jīng)常會(huì)碰到的異常情況大概有以下兩種募书。

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

這種情況產(chǎn)生的可能性會(huì)很多,最常見(jiàn)的就是旋轉(zhuǎn)屏幕莹捡,當(dāng)然還有就是系統(tǒng)提供的模式切換等等鬼吵。當(dāng)然,針對(duì)異常情況篮赢,系統(tǒng)本身提供了方法供我們處理后續(xù)事件齿椅。最重要的兩個(gè)方法就是onSaveInstanceState和onRestoreInstanceState,其中onSaveInstanceState用于在異常情況下Activity被銷(xiāo)毀時(shí)保存我們想要保存的數(shù)據(jù)启泣,onRestoreInstanceState用于異常情況下的Activity被銷(xiāo)毀重建后獲取保存的數(shù)據(jù)涣脚。下面我們以旋轉(zhuǎn)屏幕來(lái)舉例。

首先我們來(lái)看一下異常情況下Activity的生命周期執(zhí)行情況:

2.png

注意看寥茫,當(dāng)我們旋轉(zhuǎn)手機(jī)屏幕的時(shí)候遣蚀,首先執(zhí)行了onPause方法,緊接著執(zhí)行onSaveInstanceState方法纱耻,在這里我們可以對(duì)我們需要保存的數(shù)據(jù)進(jìn)行處理了芭梯,最后執(zhí)行onStop->onDestroy,到這里意味著MainActivity被銷(xiāo)毀了弄喘。但是緊接著你會(huì)發(fā)現(xiàn)MainActivity會(huì)被重新創(chuàng)建玖喘,它會(huì)執(zhí)行onCreate->onStart->onRestoreInstanceState->onResume方法,我們可以很清楚的看到限次,創(chuàng)建MainActivity所執(zhí)行的方法里面比正常情況下的生命周期多了一個(gè)

onRestoreInstanceState方法芒涡,那么現(xiàn)在我們來(lái)試一試如果在onSaveInstanceState保存數(shù)據(jù),在onRestoreInstanceState方法里面是否能夠拿到我們保存的數(shù)據(jù)卖漫,對(duì)MainActivity做稍微修改,如下:


3.png

這個(gè)代碼很簡(jiǎn)單赠群,就是在onSaveInstanceState里面存一個(gè)key為name羊始,值為stevens的數(shù)據(jù),

然后在onRestoreInstanceState里面拿出這個(gè)數(shù)據(jù)查描,注意需要進(jìn)行非空判斷突委,現(xiàn)在運(yùn)行程序看看打印的結(jié)果。

4.png

發(fā)現(xiàn)沒(méi)有冬三,發(fā)現(xiàn)沒(méi)有匀油,我們真的在onRestoreInstanceState方法里面拿到了我們之前存儲(chǔ)的數(shù)據(jù)啦。

情況二:資源內(nèi)存不足導(dǎo)致優(yōu)先級(jí)低的Activity被系統(tǒng)殺死勾笆。

做過(guò)Android開(kāi)發(fā)的童靴都知道敌蚜,手機(jī)本身是有內(nèi)存限制的,就是我們經(jīng)常用來(lái)描述手機(jī)的4G窝爪、8G內(nèi)存弛车,其實(shí)手機(jī)的內(nèi)存是指的整個(gè)手機(jī)齐媒,而每個(gè)手機(jī)上面都會(huì)安裝很多的APP,所以手機(jī)系統(tǒng)分配給每個(gè)APP的內(nèi)存都是有限的纷跛,而當(dāng)一個(gè)APP開(kāi)啟了很多Activity的時(shí)候喻括,其實(shí)每個(gè)Activity都是有各種不同狀態(tài)的,其狀態(tài)對(duì)應(yīng)的就是運(yùn)行的優(yōu)先級(jí)贫奠,具體來(lái)說(shuō)唬血,Activity的優(yōu)先級(jí)按照從高到低可以分為三種:

(1)前臺(tái)Activity —— 當(dāng)前顯示的Activity,正在和用戶(hù)交互的Activity唤崭,其優(yōu)先級(jí)最高刁品。

(2)可見(jiàn)但是非前臺(tái)Activity —— 怎么理解可見(jiàn)但是非前臺(tái),舉一個(gè)例子你就明白了浩姥,比如我在當(dāng)前的Activity彈出了一個(gè)Dialog挑随,那么此時(shí)的Activity就處于可見(jiàn)但非前臺(tái),其優(yōu)先級(jí)略低勒叠。

(3)后臺(tái)Activity —— 不可見(jiàn)Activity兜挨,比如我從A跳到B,當(dāng)B顯示后眯分,A就處于后臺(tái)狀態(tài)拌汇,其優(yōu)先級(jí)最低。

當(dāng)系統(tǒng)內(nèi)存不足的時(shí)候弊决,系統(tǒng)會(huì)按照優(yōu)先級(jí)的高低來(lái)選擇殺死哪些Activity噪舀,這種情況不太好模擬,但是其執(zhí)行的生命周期和情況一一樣飘诗,包括執(zhí)行的onSaveInstanceState和onRestoreInstanceState方法与倡,這里就不作過(guò)多講解了。

上面分析了系統(tǒng)的數(shù)據(jù)的存儲(chǔ)和恢復(fù)機(jī)制昆稿,我們知道當(dāng)系統(tǒng)資源發(fā)生改變時(shí)Activity就會(huì)被銷(xiāo)毀重建纺座,那么有沒(méi)有什么辦法可以避免Activity銷(xiāo)毀重建呢?答案肯定是可以的溉潭,因?yàn)橄到y(tǒng)為我們提供了configChanges屬性净响,用它可以指定在哪些情況下不重建當(dāng)前的activity。

configChanges的取值很多喳瓣,我們列舉幾個(gè)常用的就可以了馋贤。

<1> configChanges = “orientation”

 屏幕方向發(fā)生了改變

<2> configChanges = “l(fā)ocale”

 設(shè)備的位置發(fā)生了改變,一般指切換了語(yǔ)言

<3> configChanges = “keyboardHidden”

 鍵盤(pán)的可訪(fǎng)問(wèn)性發(fā)生了改變畏陕,比如用戶(hù)調(diào)出了鍵盤(pán)

當(dāng)然配乓,configChanges可供選擇的值遠(yuǎn)遠(yuǎn)不只這些,具體可以自行去百度。那么現(xiàn)在我們就來(lái)試試當(dāng)我們?cè)O(shè)置configChanges = “orientation”時(shí)扰付,旋轉(zhuǎn)手機(jī)屏幕會(huì)發(fā)生什么堤撵。

首先在我們的清單文件當(dāng)中加上這么一句:

5.png

運(yùn)行一下程序看下打印的文件

6.png

我們會(huì)發(fā)現(xiàn)當(dāng)旋轉(zhuǎn)手機(jī)屏幕之后,MainActivity沒(méi)有做任何動(dòng)作羽莺,MainActivity沒(méi)有被銷(xiāo)毀重建实昨,onSaveInstanceState和onRestoreInstanceState方法也沒(méi)有被調(diào)用。取而代之的是onConfigurationChanged方法被調(diào)用盐固,我們可以在這里做我們想要的操作了荒给。

關(guān)于Activity異常情況下的生命周期就分享到這里了,歡迎大家在下面留言評(píng)論刁卜。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末志电,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蛔趴,更是在濱河造成了極大的恐慌挑辆,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件孝情,死亡現(xiàn)場(chǎng)離奇詭異鱼蝉,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)箫荡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)魁亦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人羔挡,你說(shuō)我怎么就攤上這事洁奈。” “怎么了绞灼?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵利术,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我镀赌,道長(zhǎng)氯哮,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任商佛,我火速辦了婚禮,結(jié)果婚禮上姆打,老公的妹妹穿的比我還像新娘良姆。我一直安慰自己,他們只是感情好幔戏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布玛追。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪痊剖。 梳的紋絲不亂的頭發(fā)上韩玩,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音陆馁,去河邊找鬼找颓。 笑死,一個(gè)胖子當(dāng)著我的面吹牛叮贩,可吹牛的內(nèi)容都是我干的击狮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼益老,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼彪蓬!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起捺萌,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤档冬,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后桃纯,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體酷誓,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年慈参,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了呛牲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡驮配,死狀恐怖娘扩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情壮锻,我是刑警寧澤琐旁,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站猜绣,受9級(jí)特大地震影響灰殴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜掰邢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一牺陶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辣之,春花似錦掰伸、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)合搅。三九已至,卻和暖如春歧蕉,著一層夾襖步出監(jiān)牢的瞬間灾部,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工惯退, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赌髓,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓蒸痹,卻偏偏與公主長(zhǎng)得像春弥,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子叠荠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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