Android Activity的生命周期

Android Activity的生命周期

Activity類的繼承關(guān)系圖如下:

認(rèn)識(shí)Activity的生命周期

?????? Activity是被Activity棧管理的看靠,當(dāng)一個(gè)新的Activity啟動(dòng)時(shí),此Activity將被加入到Activity棧頂芳杏,成為運(yùn)行中的Activity辟宗,前一個(gè)Activity保留在棧中泊脐,位于新Activity的底部容客,不再放到前臺(tái)约郁,直到新的Activity退出為止鬓梅。

Activity一般意義上有四種本質(zhì)區(qū)別的狀態(tài):

1绽快、運(yùn)行狀(Resume State)

???? Activity顯示在屏幕的前臺(tái)(Activity棧頂)芥丧,叫做活動(dòng)狀態(tài)或者運(yùn)行狀態(tài)(active or running)

2续担、暫停狀(Pause State)

???? 如果一個(gè)Activity失去焦點(diǎn)了乖仇,但依然可見(如Activity棧頂?shù)腁ctivity是透明的或者是非全屏的)询兴。一個(gè)暫停狀態(tài)的Activity依然是存活的(此時(shí)Activity對(duì)象存留在內(nèi)存里乃沙,保持所有的狀態(tài)、成員信息和窗口管理器的連接)蕉朵,但是系統(tǒng)處于內(nèi)存不足的情況下崔涂,會(huì)殺死這個(gè)Activity。

3始衅、停止?fàn)睿⊿top State)

???? 如果一個(gè)Activity被另外的Activity完全覆蓋掉冷蚂,叫做停止?fàn)顟B(tài)(Stopped)。它依然保持所有狀態(tài)和成員信息汛闸,但是它不再可見蝙茶,所以它的窗口被隱藏,當(dāng)系統(tǒng)內(nèi)存需要被用在其他地方的時(shí)候诸老,Stopped的Activity將被殺掉

4隆夯、銷毀狀(Destroy State)

???? 如果一個(gè)Activity是Paused或者Stopped狀態(tài)别伏,系統(tǒng)可以將該Activity從內(nèi)存中刪除,Android系統(tǒng)采用兩種方式進(jìn)行刪除耍属,要么要求該Activity結(jié)束,要么直接殺掉它的進(jìn)程。

???? 下面的圖顯示了Activity的重要狀態(tài)轉(zhuǎn)換啤月,矩形框表明Activity在狀態(tài)轉(zhuǎn)換之間的回調(diào)接口刨仑,開發(fā)人員可以重載實(shí)現(xiàn)以便執(zhí)行相關(guān)代碼辙诞,帶有顏色的橢圓形表明Activity所處的狀態(tài)较店。

在上圖中官卡,Activity有三個(gè)關(guān)鍵的循環(huán):

1、整體生命周期,從onCreate(Bundle)開始到onDestroy()結(jié)束佩研。Activity在onCreate()設(shè)置所有的“全局”狀態(tài),在onDestory()釋放所有的資源硕舆。例如:某個(gè)Activity有一個(gè)在后臺(tái)運(yùn)行的線程,用于從網(wǎng)絡(luò)下載數(shù)據(jù)钦听,則該Activity可以在onCreate()中創(chuàng)建線程,在onDestory()中停止線程卒煞。

2、可見生命周期,從onStart()開始到onStop()結(jié)束。在這段時(shí)間占键,可以看到Activity在屏幕上牲距,盡管有可能不在前臺(tái)难述,不能和用戶交互。在這兩個(gè)接口之間屯断,需要保持顯示給用戶的UI數(shù)據(jù)和資源等剃氧,例如:可以在onStart中注冊(cè)一個(gè)IntentReceiver來監(jiān)聽數(shù)據(jù)變化導(dǎo)致UI的變動(dòng),當(dāng)不再需要顯示時(shí)候,可以在onStop()中注銷它。onStart(),onStop()都可以被多次調(diào)用,因?yàn)锳ctivity隨時(shí)可以在可見和隱藏之間轉(zhuǎn)換。

3、前臺(tái)生命周期兴喂,從onResume()開始到onPause()結(jié)束。在這段時(shí)間里,該Activity處于所有Activity的最前面菌瘪,和用戶進(jìn)行交互捌木。Activity可以經(jīng)常性地在resumed和paused狀態(tài)之間切換,例如:當(dāng)設(shè)備準(zhǔn)備休眠時(shí),當(dāng)一個(gè)Activity處理結(jié)果被分發(fā)時(shí)贴膘,當(dāng)一個(gè)新的Intent被分發(fā)時(shí)诫舅。所以在這些接口方法中的代碼應(yīng)該屬于非常輕量級(jí)的,防止導(dǎo)致其他轉(zhuǎn)換變慢使得用戶需要等待玲献。

常用回調(diào)方法的作用:

1、onCreate

在Activity的一次生命周期中,onCreate方法只執(zhí)行一次刨疼。最重要的是在里面調(diào)用setContentView,初始化各種組件劲藐、設(shè)置監(jiān)聽二拐、初始化一些全局的變量形庭,還可以執(zhí)行數(shù)據(jù)操作,比如比如從Cursor中檢索數(shù)據(jù)等等涣仿。

2岛杀、onStart和onRestart、onStop

Activity進(jìn)入到Stopped狀態(tài)之后搔预,它極有可能被系統(tǒng)所回收侣监,在某些極端情況下,系統(tǒng)可能是直接殺死應(yīng)用程序的進(jìn)程造虏,而不是調(diào)用onDestory方法漓藕,所以我們需要在onStop方法中盡可能的釋放那些用戶暫時(shí)不需要使用的資源暑脆,防止內(nèi)存泄露添吗。

盡管onPause在onStop之前執(zhí)行玄帕,但是onPause只適合做一些輕量級(jí)的操作,更多的耗時(shí)耗資源的操作還是要放在onStop里面,比如說對(duì)數(shù)據(jù)保存戳吝,需要用到的數(shù)據(jù)庫(kù)操作。

因?yàn)閺腟topped狀態(tài)重啟之后祟霍, onStart和onRestart方法都會(huì)被執(zhí)行杏头,所以我們要判斷哪些操作分別要放在哪個(gè)方法里面盈包。因?yàn)榭赡茉趏nStop方法里面釋放了一些資源,那么我們必須要重啟他們醇王,這個(gè)時(shí)候這些重啟的操作放在onStart方法里面就比較好(因?yàn)閛nCreate之后也需要開啟這些資源)呢燥。那些因?yàn)镾topped之后引發(fā)的需要單獨(dú)操作的代碼,就可以放在onRestart里面寓娩。

3叛氨、onResume和onPause

onPause和onResume中做的操作,其實(shí)意義上和onStart和inStop差不多棘伴,只不過是要更輕量級(jí)的寞埠,因?yàn)閛nPause不能阻塞轉(zhuǎn)變到下一個(gè)Activity。比如:停止動(dòng)畫焊夸、取消broadcast?receivers仁连。當(dāng)然相應(yīng)的需要在onResume中重啟或初始化等等。

有時(shí)候也需要在onPause判斷用戶是調(diào)用finish結(jié)束這個(gè)Activity阱穗,還是暫時(shí)離開饭冬,以便區(qū)分處理。這時(shí)候可以調(diào)用isFinishing()方法來判斷揪阶。如果是用戶finish這個(gè)Activity昌抠,那么返回為true,如果只是暫時(shí)離開或者被系統(tǒng)回收的話鲁僚,就返回false炊苫。

4、onDestroy

確定某些資源是否沒有被釋放冰沙,做一些最終的清理工作侨艾,比如在這個(gè)Activity的onCreate中開啟的某個(gè)線程,那么就要在onDestory中確定它是否結(jié)束了倦淀,如果沒有蒋畜,就結(jié)束它。

協(xié)調(diào)各個(gè)Activity

當(dāng)ActivityA撞叽、ActivityB處于同一個(gè)App時(shí)姻成,ActivityA啟動(dòng)ActivityB時(shí),兩個(gè)Activity生命周期回調(diào)方法的順序

1愿棋、執(zhí)行ActivityA的onPause方法

2科展、依次執(zhí)行ActivityB的onCreate->onStart->onResume方法(此時(shí)ActivityB顯示在前臺(tái)、獲得焦點(diǎn))

3糠雨、然后才睹,ActivityA變得不可見,則執(zhí)行ActivityA的onStop方法

????? 根據(jù)這些方法調(diào)用順序,可以知道:如果需要在ActivityA保存數(shù)據(jù)到數(shù)據(jù)庫(kù)琅攘,接著讓ActivityB讀取垮庐,那么你應(yīng)該在onPause()方法里執(zhí)行持久化操作,而不是在onStop()方法里坞琴。



參考:

Android activity的生命周期

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末哨查,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子剧辐,更是在濱河造成了極大的恐慌寒亥,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荧关,死亡現(xiàn)場(chǎng)離奇詭異溉奕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)忍啤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門加勤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人同波,你說我怎么就攤上這事胸竞。” “怎么了参萄?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)煎饼。 經(jīng)常有香客問我讹挎,道長(zhǎng),這世上最難降的妖魔是什么吆玖? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任筒溃,我火速辦了婚禮,結(jié)果婚禮上沾乘,老公的妹妹穿的比我還像新娘怜奖。我一直安慰自己,他們只是感情好翅阵,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布歪玲。 她就那樣靜靜地躺著,像睡著了一般掷匠。 火紅的嫁衣襯著肌膚如雪滥崩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天讹语,我揣著相機(jī)與錄音钙皮,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛短条,可吹牛的內(nèi)容都是我干的导匣。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼茸时,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼贡定!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起屹蚊,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤厕氨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后汹粤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體命斧,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年嘱兼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了国葬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡芹壕,死狀恐怖汇四,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情踢涌,我是刑警寧澤通孽,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站睁壁,受9級(jí)特大地震影響背苦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜潘明,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一行剂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钳降,春花似錦厚宰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吓坚,卻和暖如春备燃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背凌唬。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工并齐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留漏麦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓况褪,卻偏偏與公主長(zhǎng)得像撕贞,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子测垛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

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

  • 對(duì)于Activity的生命周期捏膨,相信只要已經(jīng)接觸過Android的同學(xué),一定可以說出個(gè)大概食侮,因?yàn)锳ctivity的...
    抱走_(dá)蘿莉閱讀 477評(píng)論 0 0
  • 啟動(dòng)與銷毀Activity 不同于使用 main() 方法啟動(dòng)應(yīng)用的其他編程范例号涯,Android 系統(tǒng)會(huì)通過調(diào)用對(duì)...
    安卓Boy閱讀 1,775評(píng)論 3 5
  • 本文主要有以下幾點(diǎn): 什么叫返回棧? Activity 的四種狀態(tài) Activity 的生命周期 1. 什么叫返回...
    AshengTan閱讀 887評(píng)論 0 1
  • 一锯七、初識(shí)Activity 在日常應(yīng)用中Activity是與用戶交互的接口链快,它提供了一個(gè)用戶完成相關(guān)操作的窗口。當(dāng)我...
    Android開發(fā)__落岑閱讀 361評(píng)論 0 1
  • 元宵節(jié)那天眉尸,在BM武漢營(yíng)看到自我管理第19期訓(xùn)練營(yíng)的報(bào)名鏈接域蜗,永澄大大、秋水教主噪猾、賽美老師霉祸、秋葉大叔四人聯(lián)合授課,...
    水若_小水囈夢(mèng)閱讀 188評(píng)論 4 4