談?wù)凙ctivity正常/異常的生命周期

正常的生命周期分析

Activity各回調(diào)方法

  1. onCreate

    • 何時:Activity正在被創(chuàng)建。
    • 作用:進(jìn)行初始化工作,如setContentView(界面資源)弄息、初始化Activity所需數(shù)據(jù)猬膨。
    • 注意:此方法的傳參Bundle為該Activity上次被異常情況銷毀時保存的狀態(tài)信息。
  2. onRestart

    • 何時:Activity正在重新啟動答毫。當(dāng)前Activity從不可見重新變?yōu)榭梢姟?/li>
  3. onStart

    • 何時:Activity正在被啟動褥民。此時Activity已可見,但還不在前臺洗搂,還無法和用戶交互消返。
  4. onResume

    • 何時:Activity已在前臺
  5. onPause

    • 何時:Activity正在停止耘拇。當(dāng)前Activity已不在前臺撵颊。
    • 作用:你需要保存更改到持久數(shù)據(jù)、停止一些動畫惫叛、停止一些耗時CPU操作等秦驯。
    • 注意:
      1. 此方法不可做耗時操作。onPause()必須先執(zhí)行完挣棕,新Activity的onResume()才會執(zhí)行译隘。
      2. 正常情況下,onStop()會緊接著被調(diào)用洛心,但若此時快速地再回到當(dāng)前Activity固耘,那么onResume()會被調(diào)用。(極端情況词身,難以重現(xiàn))
  6. onStop

    • 何時:Activity即將停止厅目。當(dāng)前Activity已不可見
    • 作用:在此方法中,可做一些稍微重量級的回收工作损敷,如:取消網(wǎng)絡(luò)連接葫笼、注銷廣播接收器等。
  7. onDestroy

    • 何時:Activity即將被銷毀拗馒。
    • 作用:做回收工作和最終的資源釋放路星。

生命周期的切換過程

Activity生命周期
  1. 第一次啟動,回調(diào)如下:onCreate -> onStart -> onResume诱桂;
  2. 當(dāng)用戶打開新的Activity時洋丐,回調(diào)如下:A onPause -> B onCreate -> B onStart -> B onResume -> A onStop。注意挥等,若新的Activity采用了透明主題友绝,那么當(dāng)前Activity不會回調(diào)onStop
  3. 當(dāng)用戶再次回到原Activity時肝劲,回調(diào)如下:onRestart -> onStart -> onResume迁客;
  4. 當(dāng)前Activity在前臺,用戶按back鍵時辞槐,回調(diào)如下:onPause -> onStop -> onDestroy哲泊;
  5. 當(dāng)前Activity在前臺,用戶按Home鍵時催蝗,回調(diào)如下:onPause -> onStop切威;
  6. 當(dāng)前Activity在前臺,用戶鎖屏?xí)r丙号,回調(diào)如下:onPause -> onStop先朦。

生命周期的各階段

  1. 完整生命周期

    • Activity在onCreate()onDestroy()之間所經(jīng)歷的。
    • onCreate()中完成各初始化操作犬缨;在onDestroy()中釋放資源喳魏。
  2. 可見生命周期

    • Activity在onStart()onStop()之間所經(jīng)歷的。
    • 活動對于用戶是可見的怀薛,但仍無法與用戶進(jìn)行交互刺彩。
  3. 前臺生命周期

    • Activity在onResume()onPause()之間所經(jīng)歷的。
    • 活動可見枝恋,且可交互创倔。

異常的生命周期分析

onSaveInstanceStateonRestoreInstanceState

  1. Activity的onSaveInstanceStateonRestoreInstanceState

    1. 出現(xiàn)異常情況;
    2. Activity被銷毀焚碌,回調(diào)onPause -> onStop -> onDestroy畦攘;
    3. 因?yàn)锳ctivity是在異常情況下終止的,系統(tǒng)會調(diào)用onSaveInstanceState來保存當(dāng)前Activity的狀態(tài)十电。此方法在onStop之前調(diào)用知押。它與onPause沒有既定的時序關(guān)系叹螟。
    4. Activity被重新創(chuàng)建,回調(diào)onCreate -> onStart -> onResume台盯;
    5. 系統(tǒng)會將上次異常終止時保存的狀態(tài)傳遞onRestoreInstanceStateonCreate罢绽。onRestoreInstanceStateonStart之后被調(diào)用
  2. View的onSaveInstanceStateonRestoreInstanceState

    1. 出現(xiàn)異常情況静盅;
    2. Activity被銷毀良价,系統(tǒng)會默認(rèn)保存當(dāng)前Activity的視圖結(jié)構(gòu):
      1. Activity調(diào)動onSaveInstanceState去保存數(shù)據(jù);
      2. 然后Activity會委托Window去保存數(shù)據(jù)温亲;
      3. Window再委托它的頂級ViewGroup去保存數(shù)據(jù)棚壁;
      4. 其頂級ViewGroup再一一調(diào)用它的子視圖View的onSaveInstanceState來保存數(shù)據(jù)杯矩。
    3. Activity被重新創(chuàng)建栈虚,系統(tǒng)會恢復(fù)上次異常終止時保存的視圖結(jié)構(gòu),其onRestoreInstanceState流程與上面類似史隆,也是上層委托下層魂务。

內(nèi)存不足導(dǎo)致的生命周期

  • Activity的優(yōu)先級

    1. 前臺Activity —— 正在和用戶交互,優(yōu)先級最高泌射;
    2. 可見但不在前臺的Activity —— 比如Activity中有彈窗粘姜,導(dǎo)致其可見但不在前臺,無法與用戶交互熔酷;
    3. 后臺Activity —— 已被停止的Activity孤紧,比如執(zhí)行onStop,優(yōu)先級最低拒秘。
  • 當(dāng)系統(tǒng)內(nèi)存不足時号显,會按照Activity優(yōu)先級從低到高去殺死目標(biāo)Activity所在的進(jìn)程。

  • 若一個進(jìn)程沒有四大組件在執(zhí)行躺酒,那么這個進(jìn)程將很快被系統(tǒng)殺死押蚤。

系統(tǒng)配置改變導(dǎo)致的生命周期

  • 當(dāng)系統(tǒng)配置發(fā)生改變后,Activity會被銷毀且重新創(chuàng)建羹应。

  • 系統(tǒng)配置中有很多內(nèi)容揽碘,若當(dāng)某項(xiàng)內(nèi)容發(fā)生改變后,我們不想系統(tǒng)重新創(chuàng)建Activity园匹,可給Activity指定configChanges屬性雳刺。之后當(dāng)指定的系統(tǒng)配置項(xiàng)發(fā)生改變時,Activity不會被重新創(chuàng)建裸违,系統(tǒng)僅僅回調(diào)其void onConfigurationChanged(Configuration newConfig);

    android:configChanges="orientation|keyboardHidden|locale"
    
系統(tǒng)配置項(xiàng) 含義
mcc SIM卡唯一標(biāo)識IMSI中的國家代碼發(fā)生改變煞烫,三位數(shù)字。<Br>中國為460累颂。
mnc SIM卡唯一標(biāo)識IMSI中的運(yùn)營商代碼發(fā)生改變滞详,兩位數(shù)字凛俱。<Br>中國移動TD系統(tǒng)為00,聯(lián)通為01料饥,電信為03蒲犬。
locale 設(shè)備的本地位置發(fā)生改變。<Br>如切換了系統(tǒng)語言岸啡。
touchscreen 觸摸屏發(fā)生改變原叮。
keyboard 鍵盤類型發(fā)生改變。<Br>比如用戶使用了外接鍵盤巡蘸。
keyboardHidden 鍵盤的可訪問性發(fā)生改變奋隶。<Br>比如用戶調(diào)出了鍵盤。
navigation 系統(tǒng)導(dǎo)航方式發(fā)生改變悦荒。<Br>如采用了軌跡球?qū)Ш健?/td>
screenLayout 屏幕布局發(fā)生改變唯欣。<Br>如用戶激活了另一個顯示設(shè)備。
fontScale 系統(tǒng)字體縮放比例發(fā)生改變搬味。
uiMode 用戶界面模式發(fā)生改變境氢。<Br>如開啟了夜間模式(API8添加)。
orientation 屏幕方向發(fā)生改變碰纬。<Br>如旋轉(zhuǎn)手機(jī)屏幕萍聊。
screenSize 屏幕的尺寸信息發(fā)生改變。<Br>若minSdkVersiontargetSdkVersion都低于13時悦析,此項(xiàng)不生效寿桨。
smallestScreenSize 設(shè)備的實(shí)際物理屏幕尺寸發(fā)生改變,這個項(xiàng)和屏幕的方向沒有關(guān)系强戴。<Br>比如用戶切換到外部的顯示設(shè)備上亭螟。<Br>若minSdkVersiontargetSdkVersion都低于13時,此項(xiàng)不生效酌泰。
layoutDirection 布局方向發(fā)生改變媒佣。(API17添加)

我的博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市陵刹,隨后出現(xiàn)的幾起案子默伍,更是在濱河造成了極大的恐慌,老刑警劉巖衰琐,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件也糊,死亡現(xiàn)場離奇詭異,居然都是意外死亡羡宙,警方通過查閱死者的電腦和手機(jī)狸剃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狗热,“玉大人钞馁,你說我怎么就攤上這事虑省。” “怎么了僧凰?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵探颈,是天一觀的道長。 經(jīng)常有香客問我训措,道長伪节,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任绩鸣,我火速辦了婚禮怀大,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘呀闻。我一直安慰自己化借,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布总珠。 她就那樣靜靜地躺著屏鳍,像睡著了一般勘纯。 火紅的嫁衣襯著肌膚如雪局服。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天驳遵,我揣著相機(jī)與錄音淫奔,去河邊找鬼。 笑死堤结,一個胖子當(dāng)著我的面吹牛唆迁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播竞穷,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼唐责,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瘾带?” 一聲冷哼從身側(cè)響起鼠哥,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎看政,沒想到半個月后朴恳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡允蚣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年于颖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嚷兔。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡森渐,死狀恐怖做入,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情同衣,我是刑警寧澤母蛛,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站乳怎,受9級特大地震影響彩郊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蚪缀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一秫逝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧询枚,春花似錦违帆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至渊抄,卻和暖如春尝胆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背护桦。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工含衔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人二庵。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓贪染,卻偏偏與公主長得像,于是被迫代替她去往敵國和親催享。 傳聞我的和親對象是個殘疾皇子杭隙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

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

  • 啟動與銷毀Activity 不同于使用 main() 方法啟動應(yīng)用的其他編程范例,Android 系統(tǒng)會通過調(diào)用對...
    安卓Boy閱讀 1,775評論 3 5
  • 這是我第三遍看《Android開發(fā)藝術(shù)探索》這本書了因妙,從第一遍看的云里霧里痰憎,第二遍略微明白之后,我決定看第三遍兰迫,并...
    陳添閱讀 863評論 2 8
  • 您的應(yīng)用中的Activity應(yīng)該做到如下需求: 1.用戶在使用應(yīng)用時接聽來電或切換到另一個應(yīng)用信殊,它不會崩潰。 2....
    正陽Android閱讀 530評論 1 0
  • 女人遇到自己愛的男人 就像找到主人的貓咪 她用心扮演著 可愛汁果,呆萌涡拘,單純…… 有一天貓兒受了傷 特別疼痛, 她努力...
    白玉仙子閱讀 394評論 0 0
  • “梓韻据德,我們只要把這一個任務(wù)完成鳄乏,我們就遠(yuǎn)走高飛跷车,好嗎?”洛奇米·迪克蘭斯深情地捧著羅梓韻臉說橱野。羅梓韻聽了朽缴,高興而...
    樰婼纓蓓閱讀 263評論 0 0