共用方式為


逐步解說 - 儲存活動狀態

我們已涵蓋活動生命週期指南中儲存狀態背後的理論:現在,讓我們逐步解說範例。

活動狀態逐步解說

讓我們開啟 ActivityLifecycle_Start 專案、建置並執行它。 這是一個非常簡單的專案,有兩個活動來示範活動生命週期,以及呼叫各種生命週期方法的方式。 當您啟動應用程式時,會顯示 的 MainActivity 畫面:

活動 A 畫面

檢視狀態轉換

此範例中的每個方法都會寫入 IDE 應用程式輸出視窗,以指出活動狀態。 (若要在 Visual Studio 中開啟輸出視窗,請輸入 CTRL-ALT-O;若要在 Visual Studio for Mac 中開啟輸出視窗,請按兩下 [檢視 > 面板 > 應用程式輸出]。

應用程式第一次啟動時,輸出視窗會顯示活動 A 的狀態變更

[ActivityLifecycle.MainActivity] Activity A - OnCreate
[ActivityLifecycle.MainActivity] Activity A - OnStart
[ActivityLifecycle.MainActivity] Activity A - OnResume

當我們按兩下 [ 啟動活動 B ] 按鈕時,我們看到 活動 A 暫停和停止,而 活動 B 會經歷其狀態變更:

[ActivityLifecycle.MainActivity] Activity A - OnPause
[ActivityLifecycle.SecondActivity] Activity B - OnCreate
[ActivityLifecycle.SecondActivity] Activity B - OnStart
[ActivityLifecycle.SecondActivity] Activity B - OnResume
[ActivityLifecycle.MainActivity] Activity A - OnStop

因此, 活動 B 會啟動並顯示以取代 活動 A

活動 B 畫面

當我們按兩下 [ 上一步 ] 按鈕時, 活動 B 會終結並 繼續活動 A

[ActivityLifecycle.SecondActivity] Activity B - OnPause
[ActivityLifecycle.MainActivity] Activity A - OnRestart
[ActivityLifecycle.MainActivity] Activity A - OnStart
[ActivityLifecycle.MainActivity] Activity A - OnResume
[ActivityLifecycle.SecondActivity] Activity B - OnStop
[ActivityLifecycle.SecondActivity] Activity B - OnDestroy

新增點選計數器

接下來,我們將變更應用程式,讓按鈕計數並顯示按下的次數。 首先,讓我們將 _counter 實例變數新增至 MainActivity

int _counter = 0;

接下來,讓我們編輯 Resource/layout/Main.axml 版面配置檔案,並新增新的 clickButton ,以顯示使用者按下按鈕的次數。 產生的 Main.axml 應該如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <Button
        android:id="@+id/myButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/mybutton_text" />
    <Button
        android:id="@+id/clickButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/counterbutton_text" />
</LinearLayout>

讓我們將下列程式代碼新增至 中的 MainActivity OnCreate 方法結尾– 此程式代碼會處理 來自 的 clickButtonClick 事件:

var clickbutton = FindViewById<Button> (Resource.Id.clickButton);
clickbutton.Text = Resources.GetString (
    Resource.String.counterbutton_text, _counter);
clickbutton.Click += (object sender, System.EventArgs e) =>
{
    _counter++;
    clickbutton.Text = Resources.GetString (
        Resource.String.counterbutton_text, _counter);
} ;

當我們再次建置並執行應用程式時,新的按鈕會出現遞增,並在每次按下時顯示的值 _counter

新增觸控計數

但是,當我們將裝置旋轉為橫向模式時,此計數會遺失:

旋轉至橫向會將計數設定回零

檢查應用程式輸出時,我們看到 活動 A 已暫停、停止、終結、重新建立、重新啟動,然後在從直向旋轉到橫向模式期間繼續:

[ActivityLifecycle.MainActivity] Activity A - OnPause
[ActivityLifecycle.MainActivity] Activity A - OnStop
[ActivityLifecycle.MainActivity] Activity A - On Destroy

[ActivityLifecycle.MainActivity] Activity A - OnCreate
[ActivityLifecycle.MainActivity] Activity A - OnStart
[ActivityLifecycle.MainActivity] Activity A - OnResume

因為 活動 A 會在旋轉裝置時再次終結並重新建立,因此其實例狀態會遺失。 接下來,我們將新增程式代碼來儲存和還原實例狀態。

新增程式代碼以保留實例狀態

讓我們將方法新增至 以 MainActivity 儲存實例狀態。 在終結活動 A 之前,Android 會自動呼叫 OnSaveInstanceState,並傳入我們可用來儲存實例狀態的套件組合 讓我們用它來將點擊計數儲存為整數值:

protected override void OnSaveInstanceState (Bundle outState)
{
    outState.PutInt ("click_count", _counter);
    Log.Debug(GetType().FullName, "Activity A - Saving instance state");

    // always call the base implementation!
    base.OnSaveInstanceState (outState);    
}

重新建立並繼續活動 A,Android 會將此Bundle專案傳回我們的OnCreate方法。 讓我們將程式代碼新增至 OnCreate 以從傳入 Bundle的 還原_counter值。 在訂的行 clickbutton 前面新增下列程式代碼:

if (bundle != null)
{
    _counter = bundle.GetInt ("click_count", 0);
    Log.Debug(GetType().FullName, "Activity A - Recovered instance state");
}

再次建置並執行應用程式,然後按下第二個按鈕幾次。 當我們將裝置旋轉為橫向模式時,會保留計數!

旋轉螢幕會顯示四個保留的計數

讓我們看看輸出視窗,看看發生了什麼事:

[ActivityLifecycle.MainActivity] Activity A - OnPause
[ActivityLifecycle.MainActivity] Activity A - Saving instance state
[ActivityLifecycle.MainActivity] Activity A - OnStop
[ActivityLifecycle.MainActivity] Activity A - On Destroy

[ActivityLifecycle.MainActivity] Activity A - OnCreate
[ActivityLifecycle.MainActivity] Activity A - Recovered instance state
[ActivityLifecycle.MainActivity] Activity A - OnStart
[ActivityLifecycle.MainActivity] Activity A - OnResume

呼叫 OnStop 方法之前,我們呼叫了新的 OnSaveInstanceState 方法,以將值儲存 _counter 在 中 Bundle。 Android 會在呼叫 方法OnCreate時將此傳Bundle回給我們,而且我們能夠用它來將值還原_counter到我們離開的位置。

摘要

在此逐步解說中,我們已使用活動生命週期的知識來保留狀態數據。