正常的生命周期分析
Activity各回調(diào)方法
-
onCreate
- 何時:Activity正在被創(chuàng)建。
- 作用:進(jìn)行初始化工作,如setContentView(界面資源)弄息、初始化Activity所需數(shù)據(jù)猬膨。
- 注意:此方法的傳參Bundle為該Activity上次被異常情況銷毀時保存的狀態(tài)信息。
-
onRestart
- 何時:Activity正在重新啟動答毫。當(dāng)前Activity從不可見重新變?yōu)榭梢姟?/li>
-
onStart
- 何時:Activity正在被啟動褥民。此時Activity已可見,但還不在前臺洗搂,還無法和用戶交互消返。
-
onResume
- 何時:Activity已在前臺。
-
onPause
- 何時:Activity正在停止耘拇。當(dāng)前Activity已不在前臺撵颊。
- 作用:你需要保存更改到持久數(shù)據(jù)、停止一些動畫惫叛、停止一些耗時CPU操作等秦驯。
- 注意:
- 此方法不可做耗時操作。onPause()必須先執(zhí)行完挣棕,新Activity的onResume()才會執(zhí)行译隘。
- 正常情況下,onStop()會緊接著被調(diào)用洛心,但若此時快速地再回到當(dāng)前Activity固耘,那么onResume()會被調(diào)用。(極端情況词身,難以重現(xiàn))
-
onStop
- 何時:Activity即將停止厅目。當(dāng)前Activity已不可見。
- 作用:在此方法中,可做一些稍微重量級的回收工作损敷,如:取消網(wǎng)絡(luò)連接葫笼、注銷廣播接收器等。
-
onDestroy
- 何時:Activity即將被銷毀拗馒。
- 作用:做回收工作和最終的資源釋放路星。
生命周期的切換過程
Activity生命周期
- 第一次啟動,回調(diào)如下:
onCreate -> onStart -> onResume
诱桂; - 當(dāng)用戶打開新的Activity時洋丐,回調(diào)如下:
A onPause -> B onCreate -> B onStart -> B onResume -> A onStop
。注意挥等,若新的Activity采用了透明主題友绝,那么當(dāng)前Activity不會回調(diào)onStop
; - 當(dāng)用戶再次回到原Activity時肝劲,回調(diào)如下:
onRestart -> onStart -> onResume
迁客; - 當(dāng)前Activity在前臺,用戶按back鍵時辞槐,回調(diào)如下:
onPause -> onStop -> onDestroy
哲泊; - 當(dāng)前Activity在前臺,用戶按Home鍵時催蝗,回調(diào)如下:
onPause -> onStop
切威; - 當(dāng)前Activity在前臺,用戶鎖屏?xí)r丙号,回調(diào)如下:
onPause -> onStop
先朦。
生命周期的各階段
-
完整生命周期
- Activity在
onCreate()
和onDestroy()
之間所經(jīng)歷的。 - 在
onCreate()
中完成各初始化操作犬缨;在onDestroy()
中釋放資源喳魏。
- Activity在
-
可見生命周期
- Activity在
onStart()
和onStop()
之間所經(jīng)歷的。 - 活動對于用戶是可見的怀薛,但仍無法與用戶進(jìn)行交互刺彩。
- Activity在
-
前臺生命周期
- Activity在
onResume()
和onPause()
之間所經(jīng)歷的。 - 活動可見枝恋,且可交互创倔。
- Activity在
異常的生命周期分析
onSaveInstanceState
和onRestoreInstanceState
-
Activity的
onSaveInstanceState
和onRestoreInstanceState
- 出現(xiàn)異常情況;
- Activity被銷毀焚碌,回調(diào)
onPause -> onStop -> onDestroy
畦攘; - 因?yàn)锳ctivity是在異常情況下終止的,系統(tǒng)會調(diào)用
onSaveInstanceState
來保存當(dāng)前Activity的狀態(tài)十电。此方法在onStop
之前調(diào)用知押。它與onPause
沒有既定的時序關(guān)系叹螟。 - Activity被重新創(chuàng)建,回調(diào)
onCreate -> onStart -> onResume
台盯; - 系統(tǒng)會將上次異常終止時保存的狀態(tài)傳遞
onRestoreInstanceState
和onCreate
罢绽。onRestoreInstanceState
會在onStart
之后被調(diào)用。
-
View的
onSaveInstanceState
和onRestoreInstanceState
- 出現(xiàn)異常情況静盅;
- Activity被銷毀良价,系統(tǒng)會默認(rèn)保存當(dāng)前Activity的視圖結(jié)構(gòu):
- Activity調(diào)動
onSaveInstanceState
去保存數(shù)據(jù); - 然后Activity會委托Window去保存數(shù)據(jù)温亲;
- Window再委托它的頂級ViewGroup去保存數(shù)據(jù)棚壁;
- 其頂級ViewGroup再一一調(diào)用它的子視圖View的
onSaveInstanceState
來保存數(shù)據(jù)杯矩。
- Activity調(diào)動
- Activity被重新創(chuàng)建栈虚,系統(tǒng)會恢復(fù)上次異常終止時保存的視圖結(jié)構(gòu),其
onRestoreInstanceState
流程與上面類似史隆,也是上層委托下層魂务。
內(nèi)存不足導(dǎo)致的生命周期
-
Activity的優(yōu)先級
- 前臺Activity —— 正在和用戶交互,優(yōu)先級最高泌射;
- 可見但不在前臺的Activity —— 比如Activity中有彈窗粘姜,導(dǎo)致其可見但不在前臺,無法與用戶交互熔酷;
-
后臺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>若minSdkVersion 和targetSdkVersion 都低于13時悦析,此項(xiàng)不生效寿桨。 |
smallestScreenSize | 設(shè)備的實(shí)際物理屏幕尺寸發(fā)生改變,這個項(xiàng)和屏幕的方向沒有關(guān)系强戴。<Br>比如用戶切換到外部的顯示設(shè)備上亭螟。<Br>若minSdkVersion 和targetSdkVersion 都低于13時,此項(xiàng)不生效酌泰。 |
layoutDirection | 布局方向發(fā)生改變媒佣。(API17添加) |