Android生命周期大概分為兩種情況:
-
正常情況:
AndroidLifeCycle.jpg- 第一次啟動(dòng),回調(diào)如下:onCreate --> onStart --> onResume.
- 退出或者銷(xiāo)毀Activity,回調(diào)如下:onPause --> onStop --> onDestroy.
-
打開(kāi)一個(gè)新的Activity,舊Activity會(huì)先調(diào)用onPause(), 然后再啟動(dòng)新的Activity。回調(diào)如下:
GotoNewActivity.png -
從新Activity返回舊Activity時(shí),也是新Activity先調(diào)用onPause(),然后等舊Activity回調(diào)onRestart() --> onStart() --> onResume()啟動(dòng)后,新Activity再銷(xiāo)毀。
ReturnToOldActivity.png - 如果新Activity采用了透明主題,那么當(dāng)前Activity不會(huì)回調(diào)onStop()。
-
異常情況:
-
資源相關(guān)的系統(tǒng)配置發(fā)生改變導(dǎo)致Activity被殺死并重建(例如旋轉(zhuǎn)屏幕引起系統(tǒng)配置發(fā)生改變),Activity先正常退出,再重新創(chuàng)建。
UnusuallyRestartActivity.png
- 系統(tǒng)會(huì)調(diào)用onSaveInstanceState()保存當(dāng)前Activity的狀態(tài),并在onStop()之前調(diào)用。
- Activity重建時(shí)會(huì)調(diào)用onRestoreInstanceState()或者onCreate()恢復(fù)數(shù)據(jù)。onRestoreInstanceState()是在onStart()之后調(diào)用。
-
對(duì)于onSaveInstanceState()的調(diào)用,個(gè)人理解為Activity除了即將被銷(xiāo)毀并且有機(jī)會(huì)重新顯示的情況下會(huì)被調(diào)用(比如手機(jī)旋轉(zhuǎn)引起Activity重建),還有正常停止但也有機(jī)會(huì)重新顯示的情況下也會(huì)被調(diào)用(比如跳轉(zhuǎn)到里新的Activity)
GotoNewActivity (2).png
- 資源內(nèi)存不足導(dǎo)致低優(yōu)先級(jí)的Activity被殺死,其數(shù)據(jù)存儲(chǔ)和恢復(fù)過(guò)程和上述完全一致。
-
Activity按照優(yōu)先級(jí)從高到低,可以分以下三種:
(1). 前臺(tái)Activity —— 正在和用戶(hù)交互的Activity,優(yōu)先級(jí)最高。
(2). 可見(jiàn)但非前臺(tái)Activity —— 比如Activity中彈出了一個(gè)對(duì)話(huà)框,導(dǎo)致Activity可見(jiàn)但是位于后臺(tái)無(wú)法和用戶(hù)直接交互。
(3). 后臺(tái)Activity —— 已經(jīng)暫停的Activity,比如執(zhí)行了onStop,優(yōu)先級(jí)最低。
- 在A(yíng)ndroidManifest.xml文件里給Activity指定configChanges屬性可以設(shè)置它不用重新創(chuàng)建。
android:configChages="orientation"
- 常用的configChanges屬性有l(wèi)ocale、orientation和keyboardHidden。還需注意screenSize和smallestScreenSize。
| 項(xiàng)目 | 含義 |
|---|---|
| locale | 設(shè)備的本地位置發(fā)生了改變,一般指切換了系統(tǒng)語(yǔ)言 |
| keyboardHidden | 鍵盤(pán)類(lèi)型的可訪(fǎng)問(wèn)性發(fā)生了改變,比如用戶(hù)調(diào)出了鍵盤(pán) |
| orientation | 屏幕方向發(fā)生了改變,比如旋轉(zhuǎn)了手機(jī)屏幕 |
| screenSize | 當(dāng)屏幕的尺寸信息發(fā)生了改變,但旋轉(zhuǎn)設(shè)備屏幕時(shí),屏幕尺寸會(huì)發(fā)生變化,這個(gè)選線(xiàn)比較特殊,它和編譯選項(xiàng)有關(guān),但編譯選項(xiàng)中的minSdkVersion和tartgetSdkVersion均低于13時(shí),此選項(xiàng)不會(huì)導(dǎo)致Activity重啟,否則會(huì)導(dǎo)致Activity重啟(API 13新添加) |
| smallestScreenSize | 設(shè)備的物理屏幕尺寸發(fā)生了改變,這個(gè)項(xiàng)目和屏幕方向沒(méi)關(guān)系,僅僅表示在實(shí)際的物理屏幕的尺寸改變的時(shí)候發(fā)生,比如用戶(hù)切換到了外部的顯示設(shè)備.這個(gè)選項(xiàng)和screenSize一樣,但編譯選項(xiàng)中的minSdkVersion和tartgetSdkVersion均低于13時(shí),此選項(xiàng)不會(huì)導(dǎo)致Activity重啟,否則會(huì)導(dǎo)致Activity重啟(API 13新添加) |




