Activity詳解(二)——異常情況下的生命周期分析

最近 無意當(dāng)中看到一道面試題是關(guān)于Activity異常情況下的生命周期分析,感覺自己還有所欠缺蚀瘸,隨即在書中尋找完整答案庶橱,特記錄如下苏章。

常見的異常情況有兩種,資源相關(guān)的系統(tǒng)配置發(fā)生改變以及系統(tǒng)內(nèi)存不足時(shí)泉孩,Activity就會被殺死

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

在默認(rèn)情況下寓搬,如果我們的Activity不做特殊處理县耽,那么當(dāng)系統(tǒng)配置發(fā)生改變后,Activity就會被銷毀并重新創(chuàng)建唾琼,其生命周期如下圖:


當(dāng)系統(tǒng)配置發(fā)生改變后锡溯,Activity會被銷毀祭饭,其onPause叙量,onStop,onDestroy均會被調(diào)用悠咱,由于Activity是在異常情況下終止的析既,系統(tǒng)會調(diào)用onSaveInstanceState來保存當(dāng)前Activity的狀態(tài)谆奥。

如圖:當(dāng)豎屏切換到橫屏?xí)r,測試log如下:


當(dāng)由橫屏切換到豎屏的時(shí)候宰译,測試log如下:


由此我們可以看出沿侈,當(dāng)系統(tǒng)配置發(fā)生改變后缀拭,Activity會被銷毀,其中onPause咙好,onStop褐荷,onDestory均會被調(diào)用,同時(shí)由于Activity是在異常情況下終止的葵第,系統(tǒng)會調(diào)用onSaveInstanceState來保存當(dāng)前Activity的狀態(tài)合溺。由上圖我們可以看出,onSaveInstanceState調(diào)用時(shí)機(jī)是在onStop之前棠赛,需要說明的是這個(gè)方法只會出現(xiàn)在Activity被異常終止的情況下,正常情況下系統(tǒng)不會回調(diào)這個(gè)方法鼎俘。當(dāng)系統(tǒng)重建的時(shí)候會調(diào)用onRestoreInstanceState這個(gè)方法贸伐,并且把Activity銷毀時(shí)onSaveInstanceState方法所保存的Bundle對象作為參數(shù)同時(shí)傳遞給onRestoreInstanceState和onCreate方法怔揩,因?yàn)槲覀兛梢酝ㄟ^onCreate和onRestoreInstanceState方法來判斷Activity是否被重建了,如果被重建了伏伐,那么我們就可以取出之前保存的數(shù)據(jù)并恢復(fù)藐翎,從上圖我們可以看出实幕,onRestoreInstanceState的調(diào)用時(shí)機(jī)是在onStart之后。

同時(shí)末贾,我們知道onSaveInstanceState和onRestoreInstanceState方法當(dāng)中凰锡,系統(tǒng)為我們做了一定得恢復(fù)工作掂为。當(dāng)Activity在異常情況下需要重新創(chuàng)建時(shí),系統(tǒng)會默認(rèn)為我們保存當(dāng)前的Activity的視圖結(jié)構(gòu)勇哗,并且在Activity重啟后為我們恢復(fù)這些數(shù)據(jù)。比如文本框中用戶輸入的數(shù)據(jù)抄谐,ListVIew滾動(dòng)的位置等派歌。這些View相關(guān)的狀態(tài)系統(tǒng)都能夠默認(rèn)為我們恢復(fù)酌呆。

關(guān)于保存和恢復(fù)View層次結(jié)構(gòu)踩麦,系統(tǒng)的工作流程是這樣的:首先Activity被意外終止時(shí)祠锣,Activity會調(diào)用onSaveInstanceState去保存數(shù)據(jù),然后Activity會委托Window去保存數(shù)據(jù)蓬推,接著Window再委托它上面的頂級容器去保存數(shù)據(jù)沸伏。頂層容器是一個(gè)ViewGroup馋评,一般來說它可能是DecorView留特。最后頂層容器再去意義通知它的子元素來保存數(shù)據(jù),這樣整個(gè)數(shù)據(jù)保存過程就完成了糊渊『睾龋可以發(fā)現(xiàn)躏鱼,這就是一種典型的委托思想染苛,上層委托下次躯概,父容器委托子元素去處理一件事情娶靡。

針對onSaveInstanceState方法還需要有一點(diǎn)說明姿锭,那就是系統(tǒng)只會在Activity即將被銷毀并且有機(jī)會重新顯示的情況下才會調(diào)用它。當(dāng)Activity正常銷毀的時(shí)候懂傀,系統(tǒng)不會調(diào)用onSaveInstanceState恃泪,因?yàn)楸讳N毀的Activity不可能再次被顯示贝乎。比如我們上文提到的旋轉(zhuǎn)屏幕所造成的Activity異常銷毀览效,這個(gè)過程和正常停止Activity是不一樣的锤灿,因?yàn)樾D(zhuǎn)屏幕后辆脸,Activity被銷毀的同時(shí)會立刻創(chuàng)建Activity實(shí)例啡氢,這個(gè)時(shí)候Activity有機(jī)會再次立刻展示术裸,所以系統(tǒng)要進(jìn)行數(shù)據(jù)存儲亭枷。這里可以簡單地這么理解奶栖,系統(tǒng)只在Activity異常終止的時(shí)候才會調(diào)用onSaveInstanceState和onRestoreInstanceState來存儲和恢復(fù)數(shù)據(jù)门坷,其他情況不會觸發(fā)這個(gè)過程。

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

這種情況冻晤,不是很好模擬绸吸,但是其數(shù)據(jù)存儲和恢復(fù)過程和情況1完全一致,這里我們描述一下Activity的優(yōu)先級情況锦茁,Activity按照優(yōu)先級從高到低码俩,可以分為如下三種:

1)前臺Activity——正在和用戶交互的Activity,優(yōu)先級最高

2)可見但是非前臺Activity——比如Activity中彈出了一個(gè)對話框稿存,導(dǎo)致Activity可見但是位于后臺無法和用戶直接交互

3)后臺Activity——已經(jīng)被暫停的Activity瓣履,比如執(zhí)行了onStop袖迎,優(yōu)先級最低

當(dāng)系統(tǒng)內(nèi)存不足時(shí),系統(tǒng)就會按照上述優(yōu)先級去殺死目標(biāo)Activity所在的進(jìn)程辜贵,并且后續(xù)通過onSaveInstanceState和onRestoreInstanceState來存儲和恢復(fù)數(shù)據(jù)脯宿,如果一個(gè)進(jìn)程中沒有四大組件在執(zhí)行连霉,那么這個(gè)進(jìn)程將很快被系統(tǒng)殺死嗡靡,比較好的方法是將后臺工作放入Service中從而保證進(jìn)程有一定的優(yōu)先級讨彼,這樣就不會輕易地被系統(tǒng)殺死哈误。

####歡迎關(guān)注公共號

![](https://upload-images.jianshu.io/upload_images/3258163-a5d26661ebcd43b0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蜜自,一起剝皮案震驚了整個(gè)濱河市卢佣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌戈鲁,老刑警劉巖婆殿,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件婆芦,死亡現(xiàn)場離奇詭異寞缝,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)荆陆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門被啼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來棠枉,“玉大人,你說我怎么就攤上這事命浴。” “怎么了媳溺?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵悬蔽,是天一觀的道長蝎困。 經(jīng)常有香客問我禾乘,道長逗栽,這世上最難降的妖魔是什么失暂? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任凭峡,我火速辦了婚禮决记,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘索昂。我一直安慰自己椒惨,他們只是感情好潮罪,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布沃暗。 她就那樣靜靜地躺著孽锥,像睡著了一般细层。 火紅的嫁衣襯著肌膚如雪惜辑。 梳的紋絲不亂的頭發(fā)上隔崎,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機(jī)與錄音韵丑,去河邊找鬼爵卒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛撵彻,可吹牛的內(nèi)容都是我干的钓株。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼陌僵,長吁一口氣:“原來是場噩夢啊……” “哼轴合!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起碗短,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤受葛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后总滩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡正蛙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了奸攻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖赘风,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瞬捕,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布香嗓,位于F島的核電站钾挟,受9級特大地震影響苫费,放射性物質(zhì)發(fā)生泄漏百框。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一露该、第九天 我趴在偏房一處隱蔽的房頂上張望抑党。 院中可真熱鬧害晦,春花似錦、人聲如沸俐筋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嫌套。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間帚稠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人匆瓜。 一個(gè)月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓左冬,卻偏偏與公主長得像狰腌,于是被迫代替她去往敵國和親瑰枫。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

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

  • 趁著最近沒什么項(xiàng)目胶滋,打算回顧整理下android的基礎(chǔ)知識,算是查漏補(bǔ)缺瓢湃。 關(guān)于Activity的生命周期,參看了...
    風(fēng)再起時(shí)ME閱讀 1,818評論 1 1
  • 啟動(dòng)與銷毀Activity 不同于使用 main() 方法啟動(dòng)應(yīng)用的其他編程范例,Android 系統(tǒng)會通過調(diào)用對...
    安卓Boy閱讀 1,769評論 3 5
  • 您的應(yīng)用中的Activity應(yīng)該做到如下需求: 1.用戶在使用應(yīng)用時(shí)接聽來電或切換到另一個(gè)應(yīng)用捐顷,它不會崩潰逗柴。 2....
    正陽Android閱讀 526評論 1 0
  • 這是我第三遍看《Android開發(fā)藝術(shù)探索》這本書了,從第一遍看的云里霧里,第二遍略微明白之后,我決定看第三遍,并...
    陳添閱讀 860評論 2 8
  • 操作流程:分享按鈕-分享方式(-分享對象-)分享完成問題:中間如果不需要選擇對象(即分享方式已經(jīng)包含對象迄沫,如分享到...
    takasuky閱讀 1,200評論 0 0