[已解決] onRestoreInstanceState 為什麼沒有被調用?

來源:互聯網
上載者:User

原因分析:

我的問題是因為之前為了測試螢幕的切換在資訊清單檔中設定了下面的,導致在螢幕切換的時候並沒有調用onRestoreInstanceState ,也沒有執行onDestory的方法。

 android:configChanges="keyboard|screenSize|orientation"

 <activity android:name=".MainActivity" android:configChanges="keyboard|screenSize|orientation">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>


根據官網的描述:“當您的 Activity 在先前銷毀之後重新建立時,您可以從系統向 Activity 傳遞的 Bundle 恢複已儲存的狀態。onCreate() 和 onRestoreInstanceState() 回調方法均接收包含執行個體狀態資訊的相同 Bundle。”

因為設定了上面的configChanges的參數導致onDestory的方法沒有執行,那麼也就沒有進行銷毀,所以也就不存在這個恢複了。



解決辦法:

可以暫時的將這個設定去除就可以看到Activity也會在螢幕切換的時候調用onDestory了,同時在螢幕切換的時候有回調onRestoreInstanceState 了,




參考:https://developer.android.google.cn/training/basics/activity-lifecycle/recreating.html?hl=zh-cn

Develop Training 重新建立 Activity 本課程將向您展示如何 儲存 Activity 狀態 恢複 Activity 狀態 您也應該閱讀 支援不同螢幕 處理運行時變更 Activity

在有些情況下,您的 Activity 會因正常應用行為而銷毀,比如當使用者按 返回按鈕或您的 Activity 通過調用 finish()示意自己的銷毀。 如果 Activity 當前被停止或長期未使用,或者前台 Activity 需要更多資源以致系統必須關閉後台進程恢複記憶體,系統也可能會銷毀 Activity。

當您的 Activity 因使用者按了返回 或 Activity 自行完成而被銷毀時,系統的 Activity 執行個體概念將永久消失,因為行為指示不再需要 Activity。 但是,如果系統因系統局限性(而非正常應用行為)而銷毀 Activity,儘管 Activity 實際執行個體已不在,系統會記住其存在,這樣,如果使用者導航回執行個體,系統會使用描述 Activity 被銷毀時狀態的一組已儲存資料建立 Activity 的新執行個體。 系統用於恢複先前狀態的已儲存資料被稱為“執行個體狀態”,並且是 Bundle 對象中儲存的索引值對集合。

注意:每次使用者旋轉螢幕時,您的 Activity 將被銷毀並重新建立。 當螢幕方向變化時,系統會銷毀並重新建立前台 Activity,因為螢幕配置已更改並且您的 Activity 可能需要載入備用資源(比如布局)。

預設情況下,系統會使用 Bundle 執行個體狀態儲存您的 Activity 布局(比如,輸入到 EditText 對象中的文本值)中有關每個 View 對象的資訊。 這樣,如果您的 Activity 執行個體被銷毀並重新建立,布局狀態便恢複為其先前的狀態,且您無需代碼。 但是,您的 Activity 可能具有您要恢複的更多狀態資訊,比如跟蹤使用者在 Activity 中進度的成員變數。

注:為了 Android 系統復原 Activity 中視圖的狀態,每個視圖必須具有 android:id 屬性提供的唯一 ID。

要儲存有關 Activity 狀態的其他資料,您必須替代 onSaveInstanceState() 回調方法。當使用者要離開 Activity 並在 Activity 意外銷毀時向其傳遞將儲存的 Bundle 對象時,系統會調用此方法。 如果系統必須稍後重新建立 Activity 執行個體,它會將相同的 Bundle 對象同時傳遞給 onRestoreInstanceState() 和 onCreate() 方法。

圖 2. 當系統開始停止您的 Activity 時,它會調用 onSaveInstanceState()(1),因此,您可以指定您希望在 Activity 執行個體必須重新建立時儲存的額外狀態資料。如果 Activity 被銷毀且必須重新建立相同的執行個體,系統將在 (1) 中定義的狀態資料同時傳遞給 onCreate() 方法 (2) 和 onRestoreInstanceState() 方法 (3)。 儲存 Activity 狀態

當您的 Activity 開始停止時,系統會調用 onSaveInstanceState() 以便您的 Activity 可以儲存帶有索引值對集合的狀態資訊。 此方法的預設實現儲存有關 Activity 視圖層次的狀態資訊,例如 EditText 小組件中的文本或ListView 的滾動位置。

要儲存 Activity 的更多狀態資訊,您必須實現 onSaveInstanceState() 並將索引值對添加至 Bundle 對象。 例如:

static final String STATE_SCORE = "playerScore";static final String STATE_LEVEL = "playerLevel";...@Overridepublic 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);}

注意:始終調用 onSaveInstanceState() 的超類實現,以便預設實現可以儲存視圖階層的狀態。 恢複 Activity 狀態

當您的 Activity 在先前銷毀之後重新建立時,您可以從系統向 Activity 傳遞的 Bundle 恢複已儲存的狀態。onCreate() 和 onRestoreInstanceState() 回調方法均接收包含執行個體狀態資訊的相同 Bundle。

因為無論系統正在建立 Activity 的新執行個體還是重新建立先前的執行個體,都會調用 onCreate() 方法,因此您必須在嘗試讀取它之前檢查狀態 Bundle 是否為 null。 如果為 null,則系統將建立 Activity 的新執行個體,而不是恢複已銷毀的先前執行個體。

例如,此處顯示您如何可以在 onCreate() 中恢複一些狀態資料:

@Overrideprotected 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    }    ...}

您可以選擇實現系統在 onStart() 方法之後調用的 onRestoreInstanceState(),而不是在 onCreate() 期間恢複狀態。系統只在存在要恢複的儲存狀態時調用 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);}

注意:始終調用 onRestoreInstanceState() 的超類實現,以便預設實現可以恢複視圖階層的狀態。

要瞭解更多有關因運行時重啟事件(例如旋轉螢幕時)而重新建立 Activity 的資訊,請閱讀處理運行時變更。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.