Heute werden wir sehen, wie der Status von Aktivitäten in Xamarin verwaltet (beibehalten und wiederhergestellt) wird.Android-Anwendung, um die App konsistent und reaktiv für Konfigurations- / Statusänderungen zu halten.

Inhaltsverzeichnis

Warum den Status der Aktivität beibehalten und wiederherstellen?

Wie ich bereits in meinem Beitrag über Android-Aktivitäten beschrieben habe, kann das Betriebssystem auf einige „konstante“ Statusänderungen reagieren, indem es während der Lebensdauer der Aktivität Lebenszyklusmethoden aufruft, die vom Programmierer überschrieben werden können, um einige zusätzliche Aktionen auszuführen. Es gibt jedoch einige Verhaltensweisen in Android-Apps, die die Konfiguration ändern können, wonach der Status der Aktivität (z. B. Anordnung oder Auswahl einiger Benutzeroberflächenelemente oder Kontrollkästchen) verloren gehen kann, wenn sie nicht ordnungsgemäß behandelt wird.

Um Ihnen ein echtes Beispiel zu geben: In der MoneyBack-Anwendung gibt es einen Hauptbildschirm mit zwei Registerkarten. Ich habe festgestellt, dass bei Auswahl der zweiten Registerkarte:

MoneyBack – 2. Registerkarte ausgewählt

und das Gerät wird gedreht:

MoneyBack – 1. Tab nach dem Drehen ausgewählt

Der erste Tab wird ausgewählt. Der Benutzer verliert seine Eingabe (Auswahl der 2. Registerkarte).

Die Änderung der Bildschirmausrichtung ist einer der Gründe, warum wir uns um das Speichern und Wiederherstellen von Aktivitätszuständen kümmern sollten.

Statusänderungen beibehalten – onSaveInstanceState()

Mit jeder Aktivität können wir die onSaveInstanceState-Methode (Bundle outState) überschreiben, die aufgerufen wird, wenn die aktuelle Aktivität beendet werden soll (z. B. wenn sich die Bildschirmausrichtung des Geräts ändert oder die Aktivität von Android beendet werden muss, um einige Ressourcen freizugeben).

Bitte verwechseln Sie es nicht mit Activity Lifecycle-Methoden (die ich hier bereits beschrieben habe), wie onPause() oder onStop(), die immer vom Betriebssystem aufgerufen werden, wenn eine bestimmte Aktion auftritt. Die Methode onSaveInstanceState() wird im Allgemeinen nach onPause() und vor onStop() aufgerufen, ist jedoch nicht immer der Fall. Zum Beispiel wird es überhaupt nicht aufgerufen, wenn der Benutzer von ActivityB zu ActivityA zurück navigiert, da in diesem Fall ActivityB niemals beendet wird. Weitere Details finden Sie in der offiziellen Android-Dokumentation.

onSaveInstanceState() wird mit dem angegebenen Bundle-Parameter aufgerufen. Es stellt ein einfaches Schlüssel-Wert-Wörterbuch dar, das zusätzlich serialisiert wird und daher zum Speichern einfacher Werte wie Zeichenfolgen, Ganzzahlen usw. verwendet werden sollte. Es gibt andere Strukturen und Techniken zum Speichern komplexerer Daten zu Statusänderungsereignissen (siehe Link im Abschnitt „Zusammenfassung“ dieses Beitrags).

Um die aktuell ausgewählte Registerkarte zu speichern, können wir die Methode wie folgt implementieren:

protected override void onSaveInstanceState(Bundle outState)

{

var tabSelectedPosition = dies.Aktionsleiste.SelectedNavigationIndex;

outState.PutInt(„selectedTabPosition“, tabSelectedPosition);Das ist die Basis.onSaveInstanceState(outState);

}

Zeigen Sie den rohen onSaveInstanceState an.cs gehostet mit ❤ von GitHub

Jetzt wird bei jeder Änderung der Bildschirmausrichtung diese Methode aufgerufen und der Index der ausgewählten Registerkarte wird im outState-Wörterbuch unter der Taste „selectedTabPosition“ gespeichert.

Statusänderungen wiederherstellen – onRestoreInstanceState()

Sobald die Aktivität wieder zum Leben erweckt wird (wieder aufgenommen wird), wird die Methode onRestoreInstanceState(Bundle savedInstanceState) vom Betriebssystem aufgerufen. Es wird nur aufgerufen, wenn zuvor eine gespeicherte Instanz durch Aufrufen der onSaveInstanceState() -Methode onSaveInstanceState() wird. Wie Sie sehen, enthält diese Methode auch einen Bundle-Parameter, bei dem es sich um dasselbe serialisierte Schlüsselwertwörterbuch handelt, das wir zum Speichern des Status der Aktivität verwendet haben.

Im Falle der Wiederherstellung der Auswahl von Registerkarten können wir diese Methode wie folgt implementieren::

protected override void OnRestoreInstanceState(Bundle savedInstanceState)

{

base.OnRestoreInstanceState(savedInstanceState);

var previouslySelectedTabPosition = savedInstanceState.GetInt(„selectedTabPosition“, 0);

this.ActionBar.SetSelectedNavigationItem(previouslySelectedTabPosition);

}

view raw OnRestoreInstanceState.cs hosted with ❤ by GitHub

previouslySelectedTabPosition Variable wird mit einem ganzzahligen Wert aus dem unter dem Schlüssel „selectedTabPosition“ gespeicherten Bundle-Wörterbuch oder dem Standardwert (0) initialisiert, wenn nichts für den Schlüssel gespeichert wurde gefunden.

HINWEIS: Der in onRestoreInstanceState() bereitgestellte Bundle-Parameter ist genau derselbe wie der in der onCreate(Bundle bundle) -Methode, die bei der Erstellung der Aktivität aufgerufen wird. Wir könnten dort tatsächlich auch unseren gespeicherten Wert abrufen, aber in vielen Fällen erfordert das Wiederherstellen des Status (wie das Auswählen der zuvor ausgewählten Registerkarte), dass einige Benutzeroberflächenelemente bereits initialisiert sind, was zuvor in der onCreate () -Methode behandelt werden sollte. Aus diesem Grund würde ich eher vorschlagen, den Status der Aktivität mit onRestoreInstanceState() als allgemeine Regel onRestoreInstanceState() (natürlich kann es einige Ausnahmefälle geben 😉). onRestoreInstanceState() wird immer nach onCreate() aufgerufen.

Wenn wir den Bundle-Parameter in der onCreate() -Methode verwenden wollten, müssten wir jedes Mal überprüfen, ob bundle nicht NULL ist (da wir nicht wissen, ob onSaveInstanceState() zuvor aufgerufen wurde).

Infolgedessen wird dieselbe Registerkarte wie zuvor ausgewählt, auch nachdem das Gerät auf der Hauptseite von MoneyBack gedreht wurde:

MoneyBack – keeping tab selected when rotating

„Automatic“ state changes handled by Android OS

Vielleicht haben Sie in Ihrer Android-Anwendung bemerkt, dass nicht jedes UI-Element „manuell“ behandelt werden muss, indem die oben genannten Methoden implementiert werden, um seinen Status zu speichern. Android führt eine Art „automatisches“ Speichern und Wiederherstellen der Zustände grundlegender UI-Elemente durch.

Die Regel hier ist, dass, solange UI-Element (wie TextView oder Button) hat seine android:id gesetzt.axml-Layoutdatei verwaltet das Betriebssystem automatisch die Zustände dieser Elemente (z. B. in EditText eingegebener Text).

Zum Beispiel für EditText wie folgt deklariert:

seine Eigenschaften (insbesondere seine Texteigenschaft) werden bei Änderungen der Bildschirmausrichtung automatisch gespeichert und wiederhergestellt.

Zusammenfassung

Wir haben gesehen, wie man mit Statusänderungen von Android-Aktivitäten umgeht, die durch Konfigurationsänderungen verursacht werden (z. B. Änderung der Bildschirmausrichtung, Beenden der Aktivität durch das Betriebssystem, um einige Ressourcen freizugeben usw.) durch Implementierung von onSaveInstanceState() und onRestoreInstanceState() , wo wir Schlüsselwertdaten zu / aus einem serialisierten Wörterbuch hinzugefügt und abgerufen haben. Wir müssen uns nur daran erinnern, dass diese Methoden nicht immer aufgerufen werden (z. B. beim Navigieren zwischen Aktivitäten mit der Schaltfläche „Zurück“), daher sollten diese nur für bestimmte Statusänderungen verwendet werden.

Wir haben auch gesehen, dass UI-Steuerelemente mit ihrer in Layoutdateien definierten android: id ihre Status für Konfigurationsänderungen resistent machen (automatisch vom Android-Betriebssystem verarbeitet).

Das Wörterbuch ist für eine bessere Leistung und Speichernutzung serialisiert, daher sollten nur einfach typisierte Werte darin gespeichert werden (wie Zeichenfolgen oder Ganzzahlen). Um komplexere Daten zu speichern, bietet Android verschiedene Möglichkeiten, sie zu verwalten (z. B. mit onRetainNonConfigurationInstance ).

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.