Návod – Ukládání stavu aktivity

V průvodci životního cyklu aktivit jsme pokryli teorie za uložení stavu. Teď si projdeme příklad.

Návod na stav aktivity

Pojďme otevřít projekt ActivityLifecycle_Start (v ukázce ActivityLifecycle ), sestavit ho a spustit. Toto je velmi jednoduchý projekt, který má dvě aktivity k předvedení životního cyklu aktivity a způsobu, jakým jsou volány různé metody životního cyklu. Po spuštění aplikace se zobrazí obrazovka nástroje MainActivity :

Obrazovka aktivity

Zobrazení přechodů stavu

Každá metoda v tomto příkladu zapisuje do okna výstup aplikace IDE, aby označovala stav aktivity. (chcete-li otevřít okno výstup v Visual Studio, zadejte CTRL + ALT-O; chcete-li otevřít okno výstup v Visual Studio pro Mac klikněte na tlačítko zobrazit výstup aplikace.)

Po prvním spuštění aplikace zobrazí okno výstup změny stavu aktivity A:

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

Po kliknutí na tlačítko spustit aktivitu B uvidíme aktivity pozastavit a zastavit, zatímco aktivita B prochází jejími 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í se místo aktivity a:

Obrazovka aktivity B

Po kliknutí na tlačítko zpět je aktivita B zničena a aktivita A je obnovena:

[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í počítadla kliknutí

V dalším kroku se změní aplikace, takže máme tlačítko, které se počítá a zobrazuje počet pokusů o kliknutí. Nejprve přidáme _counter proměnnou instance do MainActivity :

int _counter = 0;

Nyní je třeba upravit soubor rozložení Resource/layout/Main. axml a přidat nový , který zobrazuje počet pokusů, kolikrát uživatel klikl na tlačítko. Výsledný hlavní. axml by měl vypadat 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 přidat následující kód na konec metody Create v – 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ž znovu sestavíme a znovu spustíte aplikaci, zobrazí se nové tlačítko, které se zvýší a zobrazí hodnotu _counter při každém kliknutí:

Přidat počet dotyků

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

Otočení na šířku nastaví počet zpět na nulu.

Prozkoumání výstupu aplikace uvidíme, že aktivita A byla pozastavena, zastavena, zničena, znovu vytvořena, restartována a poté obnovena při otočení z 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 je aktivita a znovu zničena a znovu vytvořena při otočení zařízení, dojde ke ztrátě stavu jeho instance. V dalším kroku 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. Před zničením aktivity a se systémem Android automaticky zavolá OnSaveInstanceState a předá do sady , 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 předá tuto zpětnou OnCreate metodu. 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");
}

Sestavte a znovu spusťte aplikaci a potom dvakrát klikněte na druhé tlačítko. Když zařízení natočíme do režimu na šířku, zachová se i tento počet.

Otáčení obrazovky zobrazuje počet 4 zachované

Pojďme se podívat na okno výstup a zjistit, 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 voláním metody Instop byla volána naše nová metoda pro uložení _counter hodnoty v Bundle . Android předal tuto Bundle zpátky do nás, když se jim říká naše OnCreate metoda, a my ji jsme dokázali použít k obnovení _counter hodnoty tam, kde jsme skončili.

Souhrn

V tomto Názorný jsme využívali naše znalosti životního cyklu aktivit k zachování dat o stavu.