Exemplarische Vorgehensweise: Speichern des Aktivitätsstatus
Wir haben die Theorie hinter dem Speichern des Zustands im Activity Lifecycle-Leitfaden behandelt; Lassen Sie uns nun ein Beispiel durchgehen.
Exemplarische Vorgehensweise für Aktivitätsstatus
Lassen Sie uns das ActivityLifecycle_Start Projekt öffnen, erstellen und ausführen. Dies ist ein sehr einfaches Projekt mit zwei Aktivitäten, um den Aktivitätslebenszyklus zu veranschaulichen und wie die verschiedenen Lebenszyklusmethoden aufgerufen werden. Wenn Sie die Anwendung starten, wird der Bildschirm angezeigt MainActivity
:
Statusübergänge anzeigen
Jede Methode in diesem Beispiel schreibt in das Ausgabefenster der IDE-Anwendung, um den Aktivitätszustand anzugeben. (Um das Ausgabefenster in Visual Studio zu öffnen, geben Sie STRG-ALT-O; zum Öffnen des Ausgabefensters > in Visual Studio für Mac klicken Sie auf "Anwendungsausgabe anzeigen>".)
Wenn die App zum ersten Mal gestartet wird, zeigt das Ausgabefenster die Statusänderungen von Aktivität A an:
[ActivityLifecycle.MainActivity] Activity A - OnCreate
[ActivityLifecycle.MainActivity] Activity A - OnStart
[ActivityLifecycle.MainActivity] Activity A - OnResume
Wenn wir auf die Schaltfläche "Aktivität B starten" klicken, wird "Aktivität A anhalten" angezeigt und beendet, während Aktivität B seine Statusänderungen durchläuft:
[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
Daher wird Aktivität B gestartet und anstelle von Aktivität A angezeigt:
Wenn wir auf die Schaltfläche "Zurück " klicken, wird "Aktivität B " zerstört, und "Aktivität A " wird fortgesetzt:
[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
Hinzufügen eines Klickzählers
Als Nächstes ändern wir die Anwendung so, dass eine Schaltfläche gezählt wird und wie oft darauf geklickt wird. Als Erstes fügen wir eine _counter
Instanzvariable zu MainActivity
:
int _counter = 0;
Als Nächstes bearbeiten wir die Layoutdatei "Ressource/Layout/Main.axml ", und fügen Sie eine neue clickButton
Datei hinzu, die anzeigt, wie oft der Benutzer auf die Schaltfläche geklickt hat. Das resultierende Main.axml sollte wie folgt aussehen:
<?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>
Fügen wir den folgenden Code am Ende der OnCreate-Methode hinzu MainActivity
: Dieser Code behandelt Klickereignisse aus dem 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);
} ;
Wenn wir die App erstellen und erneut ausführen, wird eine neue Schaltfläche angezeigt, die erhöht und den Wert für _counter
jeden Klick anzeigt:
Wenn wir das Gerät jedoch in den Querformatmodus drehen, geht diese Anzahl verloren:
Wenn Sie die Anwendungsausgabe untersuchen, sehen wir, dass Aktivität A angehalten, beendet, zerstört, neu erstellt, neu gestartet und dann während der Drehung vom Hochformat in den Querformatmodus fortgesetzt wurde:
[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
Da Aktivität A zerstört und erneut erstellt wird, wenn das Gerät gedreht wird, geht der Instanzzustand verloren. Als Nächstes fügen wir Code zum Speichern und Wiederherstellen des Instanzzustands hinzu.
Hinzufügen von Code zum Beibehalten des Instanzstatus
Fügen wir nun eine Methode zum MainActivity
Speichern des Instanzzustands hinzu. Bevor Aktivität A zerstört wird, ruft Android Automatisch OnSaveInstanceState auf und übergibt ein Bundle, mit dem wir unseren Instanzstatus speichern können. Verwenden wir es, um unsere Klickanzahl als ganzzahligen Wert zu speichern:
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);
}
Wenn Aktivität A neu erstellt und fortgesetzt wird, übergibt Android dies Bundle
wieder an unsere OnCreate
Methode. Fügen wir Code hinzu, um OnCreate
den _counter
Wert aus dem übergebenen Bundle
Code wiederherzustellen. Fügen Sie den folgenden Code direkt vor der Zeile hinzu, in clickbutton
der sie definiert ist:
if (bundle != null)
{
_counter = bundle.GetInt ("click_count", 0);
Log.Debug(GetType().FullName, "Activity A - Recovered instance state");
}
Erstellen Sie die App, und führen Sie sie erneut aus, und klicken Sie dann ein paar Mal auf die zweite Schaltfläche. Wenn wir das Gerät in den Querformatmodus drehen, bleibt die Anzahl erhalten!
Sehen wir uns das Ausgabefenster an, um zu sehen, was passiert ist:
[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
Bevor die OnStop-Methode aufgerufen wurde, wurde unsere neue OnSaveInstanceState
Methode aufgerufen, um den _counter
Wert in einem Bundle
. Android hat dies Bundle
zurück an uns übergeben, als es unsere OnCreate
Methode aufgerufen hat, und wir konnten ihn verwendet haben, um den _counter
Wert wiederherzustellen, in dem wir aufgehört haben.
Zusammenfassung
In diesem Walkthough haben wir unser Wissen über den Aktivitätslebenszyklus verwendet, um Zustandsdaten zu erhalten.