Návod – Ukládání stavu aktivity
Probrali jsme teorii úspory stavu v průvodci životním cyklem aktivity; Teď si projdeme příklad.
Návod ke stavu aktivity
Pojďme otevřít ActivityLifecycle_Start projekt, sestavit ho a spustit. Jedná se o velmi jednoduchý projekt, který má dvě aktivity, které demonstrují životní cyklus aktivity a jak se volají různé metody životního cyklu. Při spuštění aplikace se zobrazí obrazovka MainActivity
:
Zobrazení přechodů stavu
Každá metoda v této ukázce zapíše do výstupního okna aplikace IDE, které indikuje stav aktivity. (Pokud chcete otevřít okno výstupu v sadě Visual Studio, zadejte Ctrl-ALT-O; chcete-li otevřít okno výstupu v Visual Studio pro Mac, klepněte na tlačítko Zobrazit > oblasti > výstup aplikace.)
Při prvním spuštění aplikace se ve výstupním okně zobrazí změny stavu aktivity A:
[ActivityLifecycle.MainActivity] Activity A - OnCreate
[ActivityLifecycle.MainActivity] Activity A - OnStart
[ActivityLifecycle.MainActivity] Activity A - OnResume
Když klikneme na tlačítko Spustit aktivitu B , zobrazí se pozastavení a zastavení aktivity , zatímco aktivita B prochází změnami stavu:
[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
V důsledku toho se aktivita B spustí a zobrazí místo aktivity A:
Když klikneme na tlačítko Zpět , aktivita B se zničí a aktivita A se obnoví:
[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
Přidání čítače kliknutí
V dalším kroku změníme aplikaci tak, abychom měli tlačítko, které se počítá a zobrazuje počet kliknutí. Nejprve přidáme proměnnou _counter
instance do MainActivity
:
int _counter = 0;
V dalším kroku upravíme soubor rozložení Resource/layout/Main.axml a přidáme nový clickButton
soubor, který zobrazí, kolikrát uživatel kliknul na tlačítko. Výsledný Soubor Main.axml by měl vypadat přibližně takto:
<?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>
Pojďme na konec metody MainActivity
OnCreate přidat následující kód – tento kód zpracovává události kliknutí z clickButton
:
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);
} ;
Když aplikaci sestavíme a spustíme znovu, zobrazí se nové tlačítko, které se zvýší a zobrazí hodnotu _counter
jednotlivých kliknutí:
Když ale zařízení otočíme do režimu na šířku, tento počet se ztratí:
Při zkoumání výstupu aplikace vidíme, že aktivita A byla pozastavena, zastavena, zničena, znovu vytvořena, restartována a pak obnovena během otáčení z na výšku do režimu na šířku:
[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
Vzhledem k tomu, že aktivita A je zničena a znovu vytvořena při obměně zařízení, dojde ke ztrátě jeho stavu instance. Dále přidáme kód pro uložení a obnovení stavu instance.
Přidání kódu pro zachování stavu instance
Pojďme přidat metodu pro MainActivity
uložení stavu instance. Než dojde ke zničení aktivity A , Android automaticky volá OnSaveInstanceState a předává sadu , kterou můžeme použít k uložení stavu instance. Pojďme ho použít k uložení počtu kliknutí jako celočíselné hodnoty:
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);
}
Když se aktivita A znovu vytvoří a obnoví, Android ji Bundle
předá zpět do naší OnCreate
metody. Pojďme přidat kód pro OnCreate
obnovení _counter
hodnoty z předaného Bundle
. Přidejte následující kód těsně před řádek, kde clickbutton
je definován:
if (bundle != null)
{
_counter = bundle.GetInt ("click_count", 0);
Log.Debug(GetType().FullName, "Activity A - Recovered instance state");
}
Znovu sestavte a spusťte aplikaci a několikrát klikněte na druhé tlačítko. Když zařízení otočíme do režimu na šířku, počet se zachová.
Podívejme se na okno výstupu a podívejme se, co se stalo:
[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
Před zavolání OnStop metoda byla volána naše nová OnSaveInstanceState
metoda k uložení _counter
hodnoty do Bundle
. Android nám tuto Bundle
hodnotu předal, když volal naši OnCreate
metodu, a podařilo se nám ji použít k obnovení _counter
hodnoty tam, kde jsme skončili.
Shrnutí
V tomto návodu jsme použili naše znalosti o životním cyklu aktivity k zachování stavových dat.