Activity的生命周期全面分析

一.各個(gè)生命周期解釋

(1) onCreate:表示Activity正在被創(chuàng)建,生命周期第一個(gè)方法,在此方法中做一些初始化工作蛙粘,比如調(diào)用setContentView加載布局資源牲平、初始化Activity所需數(shù)據(jù)等。

(2) onRestart:表示Activity正在重新啟動(dòng)陪每,當(dāng)前Activity從不可見重新變?yōu)榭梢姞顟B(tài),主要是發(fā)生在當(dāng)用戶打開一個(gè)新Activity扮授,此時(shí)會(huì)執(zhí)行當(dāng)前Activity的onPause()和onStop()方法兽埃,接著再回到當(dāng)前這個(gè)Activity的時(shí)候會(huì)執(zhí)行此方法哀峻,或者用戶在當(dāng)前Activity頁(yè)面按下Home鍵涡相,再回到這個(gè)Activity也會(huì)執(zhí)行該方法。

(3) onStart:表示Activity正在被啟動(dòng)剩蟀,此時(shí)Activity已經(jīng)可見了催蝗,但是還沒有出現(xiàn)在前臺(tái)我們還看不到,無法與其交互育特。

(4) onResume:表示Activity在已經(jīng)可見丙号,顯示在前臺(tái)并且可以與其交互,與onStart( )的時(shí)候都是可見,但是onStart的時(shí)候Activity是在后臺(tái)犬缨,onResume的時(shí)候才在前臺(tái)喳魏。

(5) onPause:表示Activity正在停止,正常情況下會(huì)接著調(diào)用onStop()方法遍尺,但是如果Activity采用透明主題則不會(huì)調(diào)onStop()方法截酷,可以做一些存儲(chǔ)數(shù)據(jù),停止動(dòng)畫等工作,但這個(gè)方法不能處理太耗時(shí)的操作涮拗,因?yàn)樾麓蜷_的Activity是在此Activity執(zhí)行完onPause之后才能執(zhí)行onResume()乾戏。

(6) onStop:表示Activity即將停止,可以做一些稍微重量級(jí)的回收工作三热,但不能太耗時(shí)鼓择。

(7) onDestory:表示Activity即將被銷毀了,這是Activity生命周期的最后一個(gè)回調(diào)方法就漾,可以執(zhí)行最終的回收和資源釋放工作呐能。

二.生命周期回調(diào)順序

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

(2).當(dāng)用戶打開新的Activity或者切換到桌面的時(shí)候,回調(diào)如下:onPause->onStop.

(特殊情況:如果新的Activity采用透明主題抑堡,回調(diào)僅為onPause)摆出。

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

(4).當(dāng)用戶按下back返回鍵時(shí)首妖,回調(diào)如下:onPause->onStop->onDestory.

(5).當(dāng)后臺(tái)Activity被系統(tǒng)回收后再次打開應(yīng)用,回調(diào)如下:onCreate->onStart->onResume.

(6).從整個(gè)生命周期來說偎漫,onCreate和onDestory是配對(duì)的,標(biāo)識(shí)著Activity的創(chuàng)建與銷毀有缆,在整個(gè)生命周期中僅調(diào)用一次象踊。onStart和onStop是配對(duì)的,標(biāo)識(shí)著Activity的可見棚壁,在整個(gè)生命周期中可調(diào)用多次杯矩。onResume和onPause是配對(duì)的,標(biāo)識(shí)著Activity是否位于前臺(tái)袖外,在整個(gè)生命周期中可調(diào)用多次史隆。

三.生命周期相關(guān)問題

(1).不能再onPause中做重量級(jí)的耗時(shí)操作,因?yàn)楸仨氃趏nPause執(zhí)行完成后新的Activity才能onResume顯示出來.

(2).當(dāng)系統(tǒng)配置發(fā)生變化后曼验,Activity會(huì)被銷毀逆害,而此Activity是在異常情況下終止的,系統(tǒng)會(huì)調(diào)用onSaveInstanceState來保存當(dāng)前Activity狀態(tài)蚣驼,這個(gè)方法調(diào)用時(shí)機(jī)是在onStop之前魄幕,它和onPause沒有既定的時(shí)序關(guān)系,有可能在前,也有可能在后颖杏。正常情況下系統(tǒng)不會(huì)調(diào)用onSaveInstanceState纯陨,只有在Activity異常終止的情況下才調(diào)用。

(3).在onSaveInstanceState和onRestoreInstanceState來存儲(chǔ)和恢復(fù)數(shù)據(jù)。如果選擇在onCreate中來恢復(fù)數(shù)據(jù)翼抠,一定要額外的判斷Bundle是否為空.(官方文檔建議使用onRestoreInstanceState來恢復(fù)數(shù)據(jù))咙轩。系統(tǒng)也會(huì)默認(rèn)為我們做一定的恢復(fù)工作,如保存當(dāng)前Activity的視圖結(jié)構(gòu)阴颖,文本框中輸入的數(shù)據(jù)活喊,ListView滾動(dòng)位置等。

(4).關(guān)于保存和恢復(fù)View的層次結(jié)構(gòu)量愧,系統(tǒng)工作流程是:Activity異常終止,Activity調(diào)用onSaveInstanceState去保存數(shù)據(jù)钾菊,然后Activity會(huì)委托Windows去保存數(shù)據(jù),接著Window再委托它上面的頂層容器去保存數(shù)據(jù)偎肃。頂層容器是一個(gè)ViewGroup煞烫,一般來說它很可能是DectorView,最后頂層容器再去通知它的子元素保存數(shù)據(jù)累颂。(這是一種委托思想滞详,上層委托下層,父容器委托子元素去處理事情紊馏,如View的繪制過程料饥,事件分發(fā)都是采用類似的思想)

(5).內(nèi)存不足會(huì)導(dǎo)致低優(yōu)先級(jí)的Activity被殺死:

? ? ①.后臺(tái)Activity優(yōu)先級(jí)最低,因?yàn)橐呀?jīng)執(zhí)行了onStop朱监,被暫停了岸啡。

? ? ②.可見單非前臺(tái)Activity,比如Activity中彈出一個(gè)對(duì)話框赌朋,導(dǎo)致Activity可見但位于后臺(tái)無法與用戶直接交互凰狞。

? ? ③.前臺(tái)Activity,正在和用戶交互的Activity沛慢。

備注:當(dāng)系統(tǒng)內(nèi)存不足時(shí)赡若,系統(tǒng)會(huì)按照上述優(yōu)先級(jí)去殺死目標(biāo)Activity所在的進(jìn)程,要在在onSaveInstanceState和onRestoreInstanceState來存儲(chǔ)和恢復(fù)數(shù)據(jù)团甲。如果一個(gè)進(jìn)程中沒有四大組件在執(zhí)行逾冬,很容易被系統(tǒng)殺死。解決方法一般是將后臺(tái)工作放入Service中從而保證該進(jìn)程有一定的優(yōu)先級(jí)躺苦,不會(huì)輕易被系統(tǒng)殺死身腻。

四.android:configChanges屬性

如果我們沒有給Activity指定configChanges屬性,當(dāng)配置發(fā)生變化后會(huì)導(dǎo)致Activity重新創(chuàng)建匹厘,常用的配置local嘀趟,keyboardHidden,orientation愈诚,screenSize她按。

local:設(shè)備的本地位置發(fā)生了變化牛隅,一般指切換了系統(tǒng)語言。

keyboardHidden:鍵盤的可訪問性發(fā)生了變化酌泰,不如用戶調(diào)出了鍵盤媒佣。

orientation:屏幕方向發(fā)生了變化,這個(gè)最常用陵刹,比如旋轉(zhuǎn)了手機(jī)屏幕默伍。

screenSize:屏幕的尺寸信息發(fā)生了變化,當(dāng)旋轉(zhuǎn)手機(jī)屏幕時(shí)衰琐,屏幕尺寸會(huì)發(fā)生變化也糊。

? ? ①.不設(shè)置Activity的android:configChanges時(shí),切屏?xí)匦抡{(diào)用各個(gè)生命周期碘耳,切橫屏?xí)r會(huì)執(zhí)行一次显设,切豎屏?xí)r會(huì)執(zhí)行兩次框弛。

? ? ②.設(shè)置Activity的android:configChanges="orientation"時(shí)辛辨,切屏還是會(huì)重新調(diào)用各個(gè)生命周期,切橫瑟枫、豎屏?xí)r只會(huì)執(zhí)行一次

? ? ③.設(shè)置Activity的android:configChanges="orientation|keyboardHidden"時(shí)斗搞,切屏不會(huì)重新調(diào)用各個(gè)生命周期,只會(huì)執(zhí)行onConfigurationChanged方法

但是慷妙,自從Android 3.2(API 13)僻焚,在設(shè)置Activity的android:configChanges="orientation|keyboardHidden"后,還是一樣會(huì)重新調(diào)用各個(gè)生命周期的膝擂。因?yàn)閟creen size也開始跟著設(shè)備的橫豎切換而改變虑啤。所以,在AndroidManifest.xml里設(shè)置的MiniSdkVersion和 TargetSdkVersion屬性大于等于13的情況下架馋,如果你想阻止程序在運(yùn)行時(shí)重新加載Activity狞山,除了設(shè)置"orientation", 你還必須設(shè)置"ScreenSize"叉寂。

五.Activity生命周期圖


Activity生命周期切換過程

總結(jié):

本文對(duì)Android的Activity生命周期進(jìn)行了整理與介紹萍启,是對(duì)Android開發(fā)進(jìn)階要點(diǎn)進(jìn)行整理,持續(xù)整理更多Android的知識(shí)與系統(tǒng)工作機(jī)制屏鳍。

部分內(nèi)容均來源網(wǎng)上 與《Android開發(fā)藝術(shù)探索》一書勘纯。

如有相關(guān)問題可聯(lián)系作者:weixidream@gmail.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市钓瞭,隨后出現(xiàn)的幾起案子驳遵,更是在濱河造成了極大的恐慌,老刑警劉巖山涡,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堤结,死亡現(xiàn)場(chǎng)離奇詭異搏讶,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)霍殴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門媒惕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人来庭,你說我怎么就攤上這事妒蔚。” “怎么了月弛?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵肴盏,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我帽衙,道長(zhǎng)菜皂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任厉萝,我火速辦了婚禮恍飘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谴垫。我一直安慰自己章母,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布翩剪。 她就那樣靜靜地躺著乳怎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪前弯。 梳的紋絲不亂的頭發(fā)上蚪缀,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音恕出,去河邊找鬼询枚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛剃根,可吹牛的內(nèi)容都是我干的哩盲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼狈醉,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼廉油!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起苗傅,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤抒线,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后渣慕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嘶炭,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抱慌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了眨猎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抑进。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖睡陪,靈堂內(nèi)的尸體忽然破棺而出寺渗,到底是詐尸還是另有隱情,我是刑警寧澤兰迫,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布信殊,位于F島的核電站,受9級(jí)特大地震影響汁果,放射性物質(zhì)發(fā)生泄漏涡拘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一据德、第九天 我趴在偏房一處隱蔽的房頂上張望鳄乏。 院中可真熱鬧,春花似錦晋控、人聲如沸汞窗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至不铆,卻和暖如春蝌焚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背誓斥。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工只洒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人劳坑。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓毕谴,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親距芬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子涝开,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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