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
:
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:
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:
Jednak po obróceniu urządzenia do trybu poziomego ta liczba zostanie utracona:
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!
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.