如何保存和恢復(fù)Activity狀態(tài)緩存
前言
非正常行為而破壞了Activity,那么盡管實(shí)際 Activity已經(jīng)消失,但是系統(tǒng)還是會(huì)記住它已經(jīng)存在;
這樣如果用戶導(dǎo)航回到它,系統(tǒng)會(huì)創(chuàng)建一個(gè)新的的Activity使用一組保存的數(shù)據(jù)來描述Activity在被銷毀時(shí)的狀態(tài);
系統(tǒng)用于恢復(fù)以前狀態(tài)的已保存數(shù)據(jù)稱為“實(shí)例狀態(tài)”;
今天我們來詳細(xì)介紹下;
一、如何保存臨時(shí)數(shù)據(jù)
1、核心方法
- onSaveInstanceState()
2、調(diào)用時(shí)機(jī)
- 非正常行為而破壞了Activity,則會(huì)被系統(tǒng)調(diào)用;
- 當(dāng)您的Activity開始停止時(shí),系統(tǒng)會(huì)調(diào)用,onSaveInstanceState()以便您的Activity可以使用一組鍵值對(duì)來保存狀態(tài)信息;
- 此方法的默認(rèn)實(shí)現(xiàn)保存有關(guān)Activity視圖層次結(jié)構(gòu)狀態(tài)的信息,例如EditText小部件中的文本或ListView的滾動(dòng)位置;
- 為了保存Activity的附加狀態(tài)信息,您必須實(shí)現(xiàn)onSaveInstanceState()并向?qū)ο筇砑渔I值對(duì)Bundle;
3、使用說明
- static final String STATE_SCORE = "playerScore";
- static final String STATE_LEVEL = "playerLevel";
- ...
- @Override
- public void onSaveInstanceState(Bundle savedInstanceState) {
- // 保存用戶自定義的狀態(tài)
- savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
- savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);
- // 調(diào)用父類交給系統(tǒng)處理,這樣系統(tǒng)能保存視圖層次結(jié)構(gòu)狀態(tài)
- super.onSaveInstanceState(savedInstanceState);
- }
二、如何恢復(fù)臨時(shí)數(shù)據(jù)
1、核心方法
- onRestoreInstanceState()
2、調(diào)用時(shí)機(jī)
- 銷毀了你的Activity,則重新啟動(dòng)時(shí)會(huì)被系統(tǒng)調(diào)用;
- 當(dāng)您的Activity在之前被破壞后重新創(chuàng)建時(shí),您可以從Bundle系統(tǒng)通過您的Activity中恢復(fù)您的保存狀態(tài);
- 這兩個(gè)方法onCreate()和onRestoreInstanceState()回調(diào)方法都會(huì)收到Bundle包含實(shí)例狀態(tài)信息的相同方法;
說明:
- 與onSaveInstanceState()區(qū)別:此處是 “確實(shí)銷毀”后才調(diào)用
- 若是 被用戶主動(dòng)銷毀(如 用戶按Back鍵),則不會(huì)調(diào)用
- 肯定在調(diào)用 onStop()前被調(diào)用
3、調(diào)用場景
因?yàn)閛nCreate()調(diào)用該方法是否系統(tǒng)正在創(chuàng)建一個(gè)新的Activity實(shí)例或重新創(chuàng)建一個(gè)以前的實(shí)例,所以您必須Bundle在嘗試讀取之前檢查該狀態(tài)是否為空。如果它為空,那么系統(tǒng)正在創(chuàng)建一個(gè)Activity的新實(shí)例,而不是恢復(fù)之前被銷毀的實(shí)例;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState); // 記得總是調(diào)用父類
- // 檢查是否正在重新創(chuàng)建一個(gè)以前銷毀的實(shí)例
- if (savedInstanceState != null) {
- // 從已保存狀態(tài)恢復(fù)成員的值
- mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
- mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
- } else {
- // 可能初始化一個(gè)新實(shí)例的默認(rèn)值的成員
- }
- ...
- }
系統(tǒng)onRestoreInstanceState()只有在存在保存狀態(tài)的情況下才會(huì)恢復(fù),因此您不需要檢查是否Bundle為空
- public void onRestoreInstanceState(Bundle savedInstanceState) {
- // 總是調(diào)用超類,以便它可以恢復(fù)視圖層次超級(jí)
- super.onRestoreInstanceState(savedInstanceState);
- // 從已保存的實(shí)例中恢復(fù)狀態(tài)成員
- mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
- mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
- }
總結(jié)
onSaveInstanceState方法是Activity的生命周期方法,主要用于在Activity銷毀時(shí)保存一些信息;