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 projekt ActivityLifecycle_Start (v ukázce ActivityLifecycle ), 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 :

Activity A screen

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:

Activity B screen

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í:

Add touch count

Když ale zařízení otočíme do režimu na šířku, tento počet se ztratí:

Rotating to landscape sets the count back to zero

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á.

Rotating the screen shows count of four preserved

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.