Android開發(fā)系列(1):Activity生命周期理解與總結2

一贾虽、理解onSaveInstanceState()


當Activity是因為用戶點擊Back按鈕或者是activity通過調用finish()結束自己時,系統(tǒng)就丟失了對Activity實例的引用捷绑,因為這一行為意味著不再需要這個activity了。

然而氢妈,如果因為系統(tǒng)資源緊張而導致Activity的Destory粹污, 系統(tǒng)會在用戶回到這個Activity時有這個Activity存在過的記錄,系統(tǒng)會使用那些保存的記錄數據(描述了當Activity被Destory時的狀態(tài))來重新創(chuàng)建一個新的Activity實例首量。
那些被系統(tǒng)用來恢復之前狀態(tài)而保存的數據被叫做 "instance state" 壮吩,它是一些存放在Bundle對象中的key-value pairs。

Caution:

  1. onSaveInstanceState的回調用來保存狀態(tài)信息加缘。
  2. onRestoreInstanceState的回調用來恢復之前保存的數據鸭叙。

二、onSaveInstanceState與onRestoreInstanceState的調用時機


通常來說拣宏,跳轉到其他的activity或者是點擊Home都會導致當前的activity執(zhí)行onSaveInstanceState沈贝,因為這種情況下的activity都是有可能會被destory并且是需要保存狀態(tài)以便后續(xù)恢復使用的,而從跳轉的activity點擊back回到前一個activity勋乾,那么跳轉前的activity是執(zhí)行退棧的操作宋下,所以這種情況下是不會執(zhí)行onSaveInstanceState的嗡善,因為這個activity不可能存在需要重建的操作

  1. Back鍵正常退出不會調用onSaveInstanceState與onRestoreInstanceState。
D/Activity1﹕ onCreate
D/Activity1﹕ onStart
D/Activity1﹕ onResume
D/Activity1﹕ onPause
D/Activity1﹕ onStop
D/Activity1﹕ onDestroy
  1. Home鍵退出會調用onSaveInstanceState学歧。
D/Activity1﹕ onCreate
D/Activity1﹕ onStart
D/Activity1﹕ onResume
D/Activity1﹕ onPause
D/Activity1﹕ onSaveInstanceState
D/Activity1﹕ onStop
D/Activity1﹕ onDestroy
  1. Home鍵恢復會調用onRestoreInstanceState()罩引。
D/Activity1﹕ onCreate
D/Activity1﹕ onStart
D/Activity1﹕ onRestoreInstanceState
D/Activity1﹕ onResume
  1. 進入其他Activity會調用onSaveInstanceState。
A-B-A
D/Activity1﹕ onPause
D/Activity2﹕ onCreate
D/Activity1﹕ onSaveInstanceState
D/Activity1﹕ onStop
D/Activity1﹕ onRestart
D/Activity1﹕ onStart
D/Activity1﹕ onResume
D/Activity2﹕ onDestroy

返回A時并沒有調用onRestoreInstanceState枝笨,因為A處于后臺未被殺死喜最。

Caution: 調用關鍵在于Activity是否存在意外Destroy的風險药磺。

三、保存Activity狀態(tài)


當我們的activity開始Stop,系統(tǒng)會調用onSaveInstanceState() 届谈,Activity可以用鍵值對的集合來保存狀態(tài)信息企巢。
這個方法會默認保存Activity視圖的狀態(tài)信息哮奇,如在 EditText 組件中的文本或 ListView 的滑動位置西壮。
為了給Activity保存額外的狀態(tài)信息,你必須實現onSaveInstanceState() 并增加key-value pairs到 Bundle 對象中张咳,例如:

static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {    
    // Always call the superclass so it can save the view hierarchy state    
    super.onSaveInstanceState(savedInstanceState);   
   
    // Save the user's current game state    
    savedInstanceState.putInt(STATE_SCORE, 1);    
    savedInstanceState.putInt(STATE_LEVEL, 2);
}

Caution:

  1. 必須要調用 onSaveInstanceState() 方法的父類實現帝洪,這樣默認的父類實現才能保存視圖狀態(tài)的信息。
  2. Activity視圖的狀態(tài)信息會默認保存脚猾,只有當需要保存額外的狀態(tài)信息時才需要調用該方法葱峡。

四、恢復Activity狀態(tài)


當Activity從Destory中重建龙助,我們可以從系統(tǒng)傳遞的Activity的Bundle中恢復保存的狀態(tài)砰奕。

onCreate() 與 onRestoreInstanceState() 回調方法都接收到了同樣的Bundle,里面包含了同樣的實例狀態(tài)信息提鸟。

  • 由于 onCreate() 方法會在第一次創(chuàng)建新的Activity實例與重新創(chuàng)建之前被Destory的實例時都被調用军援,我們必須在嘗試讀取 Bundle 對象前檢測它是否為null。如果它為null称勋,系統(tǒng)則是創(chuàng)建一個新的Activity實例胸哥,而不是恢復之前被Destory的Activity。
@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() 赡鲜,而不是在onCreate方法里面恢復數據空厌。
    onRestoreInstanceState()方法會在 onStart() 方法之后執(zhí)行. 系統(tǒng)僅僅會在存在需要恢復的狀態(tài)信息時才會調用 onRestoreInstanceState() ,因此不需要檢查 Bundle 是否為null银酬。
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);
}

Caution: 與上面保存一樣嘲更,總是需要調用onRestoreInstanceState()方法的父類實現,這樣默認的父類實現才能保存視圖狀態(tài)的信息揩瞪。


相關文章:
Android Training
Activity生命周期中的onSaveInstanceState


[2015-08]

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末赋朦,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌北发,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喷屋,死亡現場離奇詭異琳拨,居然都是意外死亡,警方通過查閱死者的電腦和手機屯曹,發(fā)現死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門狱庇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人恶耽,你說我怎么就攤上這事密任。” “怎么了偷俭?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵浪讳,是天一觀的道長。 經常有香客問我涌萤,道長淹遵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任负溪,我火速辦了婚禮透揣,結果婚禮上,老公的妹妹穿的比我還像新娘川抡。我一直安慰自己辐真,他們只是感情好,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布崖堤。 她就那樣靜靜地躺著侍咱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪密幔。 梳的紋絲不亂的頭發(fā)上放坏,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機與錄音老玛,去河邊找鬼淤年。 笑死,一個胖子當著我的面吹牛蜡豹,可吹牛的內容都是我干的麸粮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼镜廉,長吁一口氣:“原來是場噩夢啊……” “哼弄诲!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤齐遵,失蹤者是張志新(化名)和其女友劉穎寂玲,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體梗摇,經...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡拓哟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了伶授。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片断序。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖糜烹,靈堂內的尸體忽然破棺而出违诗,到底是詐尸還是另有隱情,我是刑警寧澤疮蹦,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布诸迟,位于F島的核電站,受9級特大地震影響愕乎,放射性物質發(fā)生泄漏亮蒋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一妆毕、第九天 我趴在偏房一處隱蔽的房頂上張望慎玖。 院中可真熱鬧,春花似錦笛粘、人聲如沸趁怔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽润努。三九已至,卻和暖如春示括,著一層夾襖步出監(jiān)牢的瞬間铺浇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工垛膝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鳍侣,地道東北人。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓吼拥,卻偏偏與公主長得像倚聚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子凿可,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內容