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 :

Aktivität A-Bildschirm

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:

Bildschirm

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:

Hinzufügen der Touchanzahl

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

Beim Drehen in querformat wird die Anzahl auf Null festgelegt.

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 BundleCode 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!

Beim Drehen des Bildschirms wird die Anzahl von vier beibehaltenen

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.