生命周期
其實這張圖已經說明了activity的生命周期,但是在這里需要的注意的是,
(1)onCreat是activity正在被創建,也就是說此時的UI操作不會更新UI,比如setText操作,所以此時在子線程調用setText不會報線程錯誤。詳解可見Android子線程更新View的探索,在這個方法內我們可以做一些初始化工作。
(2)onRestart需要注意的是:activity正在重新啟動,一般情況下,activity從不可見狀態到可見狀態,onRestart才會被調用,但是一定要注意的是一般來說這是用戶行為導致activity不可見的時候,此時變為可見的時候才會調用onRestart,這里所說的用戶行為就是用戶按home鍵,或者進入“新”的activity。這樣的操作會使activity先執行onPause,后執行onStop,這樣回到這個activity會調用onRestart。為什么我這里強調說用戶行為導致的不可見狀態,等下我會說。。。。
(3)onStart的時候,activity才可見,但是沒有出現在前臺,無法與用戶交互
(4)onResume的時候,activity已經可見,并且出現在前臺開始活動,與onStart相比,activity都已經可見,但是onStart的時候activity還在后臺,onResume才顯示在前臺
(5)onPause主要注意的是:此時的activity正在被停止,接下來馬上調用onStop。特殊情況下快速回到該activity,onStop不會執行,會去執行onResume。
一般在這個生命周期內做存儲數據、停止動畫工作,但不能太耗時。
為什么特殊強調呢,因為該activity的onPause執行完了,才回去執行新的activity的onResume,一旦耗時,必然會拖慢新的activity的顯示。
(6)onStop:此時的activity即將停止。在這里可以做稍微重量級的操作,同樣也不能耗時。
(7)onDestroy:此時的activity即將被回收,在這里會做一些回收工作和最終資源釋放。
在這里我會特別提出一個point,就是異常情況下activity被殺死,而后被重新創建的情況。
這張圖非常重要,可以幫我們解決異常情況下activity如何正常回復的問題
當系統停止activity時,它會調用onSaveInstanceState()(過程1),如果activity被銷毀了,但是需要創建同樣的實例,系統會把過程1中的狀態數據傳給onCreate()和onRestoreInstanceState(),所以我們要在onSaveInstanceState()內做保存參數的動作,在onRestoreInstanceState()做獲取參數的動作。
Save Activity State
static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the user's current game state
savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);
// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}
獲取參數操作:
onCreate() 方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); // Always call the superclass first
// Check whether we're recreating a previously destroyed instance
if (savedInstanceState != null) {
// Restore value of members from saved state
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
} else {
// Probably initialize members with default values for a new instance
}
...
}
也可以
onRestoreInstanceState()方法
public void onRestoreInstanceState(Bundle savedInstanceState) {
// Always call the superclass so it can restore the view hierarchy
super.onRestoreInstanceState(savedInstanceState);
// Restore state members from saved instance
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}