逐步解說 - 儲存活動狀態
我們已涵蓋活動生命週期指南中儲存狀態背後的理論:現在,讓我們逐步解說範例。
活動狀態逐步解說
讓我們開啟 ActivityLifecycle_Start 專案、建置並執行它。 這是一個非常簡單的專案,有兩個活動來示範活動生命週期,以及呼叫各種生命週期方法的方式。 當您啟動應用程式時,會顯示 的 MainActivity
畫面:
檢視狀態轉換
此範例中的每個方法都會寫入 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 會終結並 繼續活動 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 方法結尾– 此程式代碼會處理 來自 的 clickButton
Click 事件:
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
到我們離開的位置。
摘要
在此逐步解說中,我們已使用活動生命週期的知識來保留狀態數據。