正常的生命周期分析
Activity各回調方法
-
onCreate
- 何時:Activity正在被創建。
- 作用:進行初始化工作,如setContentView(界面資源)、初始化Activity所需數據。
- 注意:此方法的傳參Bundle為該Activity上次被異常情況銷毀時保存的狀態信息。
-
onRestart
- 何時:Activity正在重新啟動。當前Activity從不可見重新變為可見。
-
onStart
- 何時:Activity正在被啟動。此時Activity已可見,但還不在前臺,還無法和用戶交互。
-
onResume
- 何時:Activity已在前臺。
-
onPause
- 何時:Activity正在停止。當前Activity已不在前臺。
- 作用:你需要保存更改到持久數據、停止一些動畫、停止一些耗時CPU操作等。
- 注意:
- 此方法不可做耗時操作。onPause()必須先執行完,新Activity的onResume()才會執行。
- 正常情況下,onStop()會緊接著被調用,但若此時快速地再回到當前Activity,那么onResume()會被調用。(極端情況,難以重現)
-
onStop
- 何時:Activity即將停止。當前Activity已不可見。
- 作用:在此方法中,可做一些稍微重量級的回收工作,如:取消網絡連接、注銷廣播接收器等。
-
onDestroy
- 何時:Activity即將被銷毀。
- 作用:做回收工作和最終的資源釋放。
生命周期的切換過程
Activity生命周期
- 第一次啟動,回調如下:
onCreate -> onStart -> onResume
; - 當用戶打開新的Activity時,回調如下:
A onPause -> B onCreate -> B onStart -> B onResume -> A onStop
。注意,若新的Activity采用了透明主題,那么當前Activity不會回調onStop
; - 當用戶再次回到原Activity時,回調如下:
onRestart -> onStart -> onResume
; - 當前Activity在前臺,用戶按back鍵時,回調如下:
onPause -> onStop -> onDestroy
; - 當前Activity在前臺,用戶按Home鍵時,回調如下:
onPause -> onStop
; - 當前Activity在前臺,用戶鎖屏時,回調如下:
onPause -> onStop
。
生命周期的各階段
-
完整生命周期
- Activity在
onCreate()
和onDestroy()
之間所經歷的。 - 在
onCreate()
中完成各初始化操作;在onDestroy()
中釋放資源。
- Activity在
-
可見生命周期
- Activity在
onStart()
和onStop()
之間所經歷的。 - 活動對于用戶是可見的,但仍無法與用戶進行交互。
- Activity在
-
前臺生命周期
- Activity在
onResume()
和onPause()
之間所經歷的。 - 活動可見,且可交互。
- Activity在
異常的生命周期分析
onSaveInstanceState
和onRestoreInstanceState
-
Activity的
onSaveInstanceState
和onRestoreInstanceState
- 出現異常情況;
- Activity被銷毀,回調
onPause -> onStop -> onDestroy
; - 因為Activity是在異常情況下終止的,系統會調用
onSaveInstanceState
來保存當前Activity的狀態。此方法在onStop
之前調用。它與onPause
沒有既定的時序關系。 - Activity被重新創建,回調
onCreate -> onStart -> onResume
; - 系統會將上次異常終止時保存的狀態傳遞
onRestoreInstanceState
和onCreate
。onRestoreInstanceState
會在onStart
之后被調用。
-
View的
onSaveInstanceState
和onRestoreInstanceState
- 出現異常情況;
- Activity被銷毀,系統會默認保存當前Activity的視圖結構:
- Activity調動
onSaveInstanceState
去保存數據; - 然后Activity會委托Window去保存數據;
- Window再委托它的頂級ViewGroup去保存數據;
- 其頂級ViewGroup再一一調用它的子視圖View的
onSaveInstanceState
來保存數據。
- Activity調動
- Activity被重新創建,系統會恢復上次異常終止時保存的視圖結構,其
onRestoreInstanceState
流程與上面類似,也是上層委托下層。
內存不足導致的生命周期
-
Activity的優先級
- 前臺Activity —— 正在和用戶交互,優先級最高;
- 可見但不在前臺的Activity —— 比如Activity中有彈窗,導致其可見但不在前臺,無法與用戶交互;
-
后臺Activity —— 已被停止的Activity,比如執行
onStop
,優先級最低。
當系統內存不足時,會按照Activity優先級從低到高去殺死目標Activity所在的進程。
若一個進程沒有四大組件在執行,那么這個進程將很快被系統殺死。
系統配置改變導致的生命周期
當系統配置發生改變后,Activity會被銷毀且重新創建。
-
系統配置中有很多內容,若當某項內容發生改變后,我們不想系統重新創建Activity,可給Activity指定
configChanges
屬性。之后當指定的系統配置項發生改變時,Activity不會被重新創建,系統僅僅回調其void onConfigurationChanged(Configuration newConfig);
android:configChanges="orientation|keyboardHidden|locale"
系統配置項 | 含義 |
---|---|
mcc | SIM卡唯一標識IMSI中的國家代碼發生改變,三位數字。<Br>中國為460。 |
mnc | SIM卡唯一標識IMSI中的運營商代碼發生改變,兩位數字。<Br>中國移動TD系統為00,聯通為01,電信為03。 |
locale | 設備的本地位置發生改變。<Br>如切換了系統語言。 |
touchscreen | 觸摸屏發生改變。 |
keyboard | 鍵盤類型發生改變。<Br>比如用戶使用了外接鍵盤。 |
keyboardHidden | 鍵盤的可訪問性發生改變。<Br>比如用戶調出了鍵盤。 |
navigation | 系統導航方式發生改變。<Br>如采用了軌跡球導航。 |
screenLayout | 屏幕布局發生改變。<Br>如用戶激活了另一個顯示設備。 |
fontScale | 系統字體縮放比例發生改變。 |
uiMode | 用戶界面模式發生改變。<Br>如開啟了夜間模式(API8添加)。 |
orientation | 屏幕方向發生改變。<Br>如旋轉手機屏幕。 |
screenSize | 屏幕的尺寸信息發生改變。<Br>若minSdkVersion 和targetSdkVersion 都低于13時,此項不生效。 |
smallestScreenSize | 設備的實際物理屏幕尺寸發生改變,這個項和屏幕的方向沒有關系。<Br>比如用戶切換到外部的顯示設備上。<Br>若minSdkVersion 和targetSdkVersion 都低于13時,此項不生效。 |
layoutDirection | 布局方向發生改變。(API17添加) |