Exemplarische Vorgehensweise: Speichern des Aktivitätsstatus
Die Theorie hinter dem Speicherzustand haben wir im Leitfaden zum Aktivitätslebenszyklus behandelt. Nun sehen wir uns ein Beispiel an.
Exemplarische Vorgehensweise zum Aktivitätsstatus
Öffnen Sie das projekt ActivityLifecycle_Start (im ActivityLifecycle-Beispiel ), erstellen Sie es, und führen Sie es aus. Dies ist ein sehr einfaches Projekt, das über zwei Aktivitäten verfügt, um den Aktivitätslebenszyklus und den Aufruf der verschiedenen Lebenszyklusmethoden zu veranschaulichen. Wenn Sie die Anwendung starten, wird der Bildschirm von MainActivity
angezeigt:
Anzeigen von Zustandsübergängen
Jede Methode in diesem Beispiel schreibt in das Ausgabefenster der IDE-Anwendung, um den Aktivitätsstatus anzugeben. (Um das Ausgabefenster in Visual Studio zu öffnen, geben Sie STRG-ALT-O ein. Klicken Sie zum Öffnen des Ausgabefensters > in Visual Studio für Mac 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 Sie auf die Schaltfläche Aktivität B starten klicken, wird Aktivität A angehalten und beendet, während Aktivität B ihre 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 Sie 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 Klickindikators
Als Nächstes ändern wir die Anwendung so, dass wir über eine Schaltfläche verfügen, die zählt und anzeigt, wie oft darauf geklickt wird. Fügen Wir zunächst eine _counter
instance Variable hinzuMainActivity
:
int _counter = 0;
Als Nächstes bearbeiten wir die Layoutdatei Resource/layout/Main.axml und fügen eine neue clickButton
hinzu, die anzeigt, wie oft der Benutzer auf die Schaltfläche geklickt hat. Die 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 Sie den folgenden Code am Ende der OnCreate-Methode in MainActivity
hinzu: Dieser Code verarbeitet Klickereignisse aus :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 erneut erstellen und ausführen, wird eine neue Schaltfläche angezeigt, die bei jedem Klick den Wert von _counter
erhöht und anzeigt:
Wenn wir das Gerät jedoch in den Querformatmodus rotieren, geht diese Anzahl verloren:
Wenn wir 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 ihr instance Zustand verloren. Als Nächstes fügen wir Code hinzu, um den instance Zustand zu speichern und wiederherzustellen.
Hinzufügen von Code zum Beibehalten des Instanzstatus
Fügen Sie eine Methode hinzu, um den instance Zustand zu MainActivity
speichern. Bevor Aktivität A zerstört wird, ruft Android automatisch OnSaveInstanceState auf und übergibt ein Bundle, mit dem wir unseren instance-Zustand speichern können. Verwenden wir ihn, 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, gibt Android dies Bundle
an unsere OnCreate
Methode zurück. Fügen Sie Code hinzu, um OnCreate
den _counter
Wert aus dem übergebenen Bundle
wiederherzustellen. Fügen Sie den folgenden Code direkt vor der Zeile hinzu, in der clickbutton
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 einige Male auf die zweite Schaltfläche. Wenn wir das Gerät in den Querformatmodus rotieren, wird die Anzahl beibehalten!
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
zu speichern. Android hat dies Bundle
an uns übergeben, als es unsere OnCreate
Methode aufgerufen hat, und wir konnten sie verwenden, um den _counter
Wert dort wiederherzustellen, wo wir aufgehört haben.
Zusammenfassung
In diesem Schritt haben wir unser Wissen über den Aktivitätslebenszyklus genutzt, um Zustandsdaten beizubehalten.