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:

Aktivität A-Bildschirm

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:

Aktivität B-Bildschirm

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:

Hinzufügen der Touchanzahl

Wenn wir das Gerät jedoch in den Querformatmodus rotieren, geht diese Anzahl verloren:

Beim Rotieren ins Querformat wird die Anzahl wieder auf 0 festgelegt.

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 Bundlewiederherzustellen. 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!

Beim Drehen des Bildschirms wird die Anzahl von vier beibehaltenen angezeigt.

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 Bundlezu 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.