Udostępnij za pośrednictwem


Przewodnik — Zapisywanie stanu aktywności

Omówiliśmy teorię zapisywania stanu w przewodniku cyklu życia działania; Teraz przyjrzyjmy się przykładowi.

Przewodnik po stanie działania

Otwórzmy projekt ActivityLifecycle_Start, skompilujmy go i uruchomimy. Jest to bardzo prosty projekt, który zawiera dwa działania umożliwiające zademonstrowanie cyklu życia działania i wywoływanie różnych metod cyklu życia. Po uruchomieniu aplikacji zostanie wyświetlony ekran MainActivity :

Ekran Działania A

Wyświetlanie przejść stanu

Każda metoda w tym przykładzie zapisuje dane w oknie danych wyjściowych aplikacji IDE, aby wskazać stan działania. (Aby otworzyć okno danych wyjściowych w programie Visual Studio, wpisz CTRL-ALT-O; aby otworzyć okno danych wyjściowych w Visual Studio dla komputerów Mac, kliknij pozycję Wyświetl > okienka > Dane wyjściowe aplikacji).

Po pierwszym uruchomieniu aplikacji w oknie danych wyjściowych zostaną wyświetlone zmiany stanu działania A:

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

Po kliknięciu przycisku Rozpocznij działanie B zobaczymy wstrzymanie działania A i zatrzymanie, gdy działanie B przechodzi przez jego stan:

[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

W związku z tym działanie B jest uruchamiane i wyświetlane zamiast działania A:

Ekran działania B

Po kliknięciu przycisku Wstecz działanie B zostanie zniszczone, a działanie A zostanie wznowione:

[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

Dodawanie licznika kliknięć

Następnie zmienimy aplikację, abyśmy mieli przycisk zliczany i wyświetlający liczbę kliknięć. Najpierw dodajmy zmienną _counter wystąpienia do :MainActivity

int _counter = 0;

Następnie zmodyfikujmy plik układu Resource/layout/Main.axml i dodajmy nowy clickButton , który wyświetla liczbę kliknięć przycisku przez użytkownika. Wynikowy plik Main.axml powinien wyglądać podobnie do następującego:

<?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>

Dodajmy następujący kod na końcu metody OnCreate w MainActivity pliku — ten kod obsługuje zdarzenia kliknięcia z elementu 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);
} ;

Po ponownym skompilowania i uruchomieniu aplikacji zostanie wyświetlony nowy przycisk, który zwiększa i wyświetla wartość _counter każdego kliknięcia:

Dodawanie liczby dotyku

Jednak po obróceniu urządzenia do trybu poziomego ta liczba zostanie utracona:

Obracanie na poziome ustawia liczbę z powrotem na zero

Sprawdzając dane wyjściowe aplikacji, widzimy, że działanie A zostało wstrzymane, zatrzymane, zniszczone, ponownie stworzone, ponownie uruchomione, a następnie wznowione podczas rotacji z trybu pionowego do poziomego:

[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

Ponieważ działanie A jest niszczone i ponownie tworzone po obróceniu urządzenia, jego stan wystąpienia zostanie utracony. Następnie dodamy kod, aby zapisać i przywrócić stan wystąpienia.

Dodawanie kodu w celu zachowania stanu wystąpienia

Dodajmy metodę , aby MainActivity zapisać stan wystąpienia. Przed zniszczeniem działania A system Android automatycznie wywołuje element OnSaveInstanceState i przekazuje pakiet, którego możemy użyć do przechowywania stanu wystąpienia. Użyjmy go, aby zapisać liczbę kliknięć jako wartość całkowitą:

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);    
}

Gdy działanie A jest ponownie tworzone i wznawiane, system Android przekazuje to Bundle z powrotem do naszej OnCreate metody. Dodajmy kod, aby OnCreate przywrócić _counter wartość z przekazanego elementu Bundle. Dodaj następujący kod tuż przed wierszem, w którym clickbutton zdefiniowano:

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

Skompiluj i uruchom ponownie aplikację, a następnie kliknij kilka razy drugi przycisk. Po obróceniu urządzenia do trybu poziomego liczba jest zachowywana!

Obracanie ekranu pokazuje liczbę czterech zachowanych

Przyjrzyjmy się oknie danych wyjściowych, aby zobaczyć, co się stało:

[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

Przed wywołaniem metody OnStop nowa OnSaveInstanceState metoda została wywołana w celu zapisania _counter wartości w obiekcie Bundle. System Android przekazał to Bundle z powrotem do nas, gdy nazwał naszą OnCreate metodę, i byliśmy w stanie go użyć do przywrócenia _counter wartości, do której odeszliśmy.

Podsumowanie

W tym przewodniku wykorzystaliśmy naszą wiedzę na temat cyklu życia działania, aby zachować dane stanu.