Ich habe an der Android SDK-Plattform gearbeitet und es ist ein wenig unklar, wie der Status einer Anwendung gespeichert werden soll. Angesichts dieser geringfügigen Überarbeitung des Beispiels "Hallo, Android":
package com.android.hello;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class HelloAndroid extends Activity {
private TextView mTextView = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mTextView = new TextView(this);
if (savedInstanceState == null) {
mTextView.setText("Welcome to HelloAndroid!");
} else {
mTextView.setText("Welcome back.");
}
setContentView(mTextView);
}
}
Ich dachte, es würde für den einfachsten Fall ausreichen, aber es antwortet immer mit der ersten Nachricht, egal wie ich von der App weg navigiere.
Ich bin mir sicher, dass die Lösung so einfach ist wie das Überschreiben onPause
oder ähnliches, aber ich habe ungefähr 30 Minuten lang in der Dokumentation gestöbert und nichts Offensichtliches gefunden.
Antworten:
Sie müssen
onSaveInstanceState(Bundle savedInstanceState)
die Anwendungsstatuswerte, die Sie in denBundle
Parameter ändern möchten, wie folgt überschreiben und schreiben :Das Bundle ist im Wesentlichen eine Möglichkeit zum Speichern einer NVP-Zuordnung ("Name-Wert-Paar"). Es wird an
onCreate()
und dort übergeben,onRestoreInstanceState()
wo Sie dann die Werte aus Aktivitäten wie diesen extrahieren würden:Oder aus einem Fragment.
Normalerweise verwenden Sie diese Technik, um Instanzwerte für Ihre Anwendung zu speichern (Auswahl, nicht gespeicherter Text usw.).
quelle
onSaveInstanceState
praktisch unbrauchbar, außer bei Änderungen der Bildschirmausrichtung. In fast allen anderen Fällen können Sie sich nie darauf verlassen und müssen Ihren UI-Status manuell an einem anderen Ort speichern. Oder verhindern Sie, dass Ihre App getötet wird, indem Sie das Verhalten der Schaltfläche "Zurück" überschreiben. Ich verstehe nicht, warum sie es überhaupt so implementiert haben. Völlig unintuitiv. Und Sie können dieses Bundle nicht haben, in dem Sie Dinge speichern können, außer in dieser speziellen Methode.View
s , die zugewiesen ids gewesen sein . Aus denonSaveInstanceState
Dokumenten: "Die Standardimplementierung übernimmt für Sie den größten Teil des UI-Status pro Instanz, indem SieonSaveInstanceState()
jede Ansicht in der Hierarchie mit einer ID aufrufen und die ID der aktuell fokussierten Ansicht speichern (die alle wiederhergestellt wird) durch die Standardimplementierung vononRestoreInstanceState(Bundle)
) "Dies
savedInstanceState
dient nur zum Speichern des Status, der einer aktuellen Instanz einer Aktivität zugeordnet ist, z. B. aktuelle Navigations- oder Auswahlinformationen. Wenn Android eine Aktivität zerstört und neu erstellt, kann sie wie zuvor wiederhergestellt werden. Siehe die Dokumentation füronCreate
undonSaveInstanceState
Für einen langlebigeren Status sollten Sie eine SQLite-Datenbank, eine Datei oder Einstellungen verwenden. Siehe Speichern des dauerhaften Status .
quelle
Beachten Sie, dass die Verwendung und für persistente Daten gemäß der Dokumentation zu Aktivitätsstatus unter http://developer.android.com/reference/android/app/Activity.html NICHT sicher ist .
onSaveInstanceState
onRestoreInstanceState
In dem Dokument heißt es (im Abschnitt "Aktivitätslebenszyklus"):
Mit anderen Worten, geben Sie Ihren Sicherungs- / Wiederherstellungscode für persistente Daten in
onPause()
und einonResume()
!EDIT : Zur weiteren Verdeutlichung hier die
onSaveInstanceState()
Dokumentation:quelle
Mein Kollege hat einen Artikel erklärt Anwendungszustand auf Android - Geräten , einschließlich Erklärungen auf Aktivität Lifecycle und Zustandsinformationen, wie Statusinformationen zu speichern und zu Speicher in dem Zustand
Bundle
undSharedPreferences
und einen Blick auf hier nehmen .Der Artikel behandelt drei Ansätze:
Speichern Sie lokale Variablen- / UI-Steuerdaten für die Anwendungslebensdauer (dh vorübergehend) mithilfe eines Instanzstatuspakets
Speichern Sie lokale Variablen- / UI-Steuerdaten zwischen Anwendungsinstanzen (dh permanent) mithilfe gemeinsamer Einstellungen
Halten von Objektinstanzen im Speicher zwischen Aktivitäten innerhalb der Anwendungslebensdauer mithilfe einer beibehaltenen Nichtkonfigurationsinstanz am Leben
quelle
Dies ist ein klassisches "Gotcha" der Android-Entwicklung. Hier gibt es zwei Probleme:
Beim Durchsuchen all dieser Themen vermute ich, dass Entwickler die meiste Zeit gleichzeitig über diese beiden unterschiedlichen Probleme sprechen ... daher all die Verwirrung und Berichte über "das funktioniert bei mir nicht".
Um das 'beabsichtigte' Verhalten zu verdeutlichen: onSaveInstance und onRestoreInstance sind fragil und nur für den vorübergehenden Zustand. Die beabsichtigte Verwendung (afaict) ist die Wiederherstellung von Aktivitäten, wenn das Telefon gedreht wird (Orientierungsänderung). Mit anderen Worten, die beabsichtigte Verwendung ist, wenn Ihre Aktivität logischerweise immer noch "oben" ist, aber immer noch vom System wiederhergestellt werden muss. Das gespeicherte Bundle wird außerhalb des Prozesses / memory / gc nicht beibehalten, sodass Sie sich nicht wirklich darauf verlassen können, wenn Ihre Aktivität in den Hintergrund tritt. Ja, vielleicht überlebt das Gedächtnis Ihrer Aktivität die Reise in den Hintergrund und entgeht der GC, aber dies ist nicht zuverlässig (und auch nicht vorhersehbar).
Wenn Sie also ein Szenario haben, in dem ein bedeutender Benutzerfortschritt oder -status vorliegt, der zwischen den Starts Ihrer Anwendung beibehalten werden sollte, sollten Sie onPause und onResume verwenden. Sie müssen einen dauerhaften Speicher selbst auswählen und vorbereiten.
ABER - es gibt einen sehr verwirrenden Fehler, der all dies kompliziert. Details finden Sie hier:
http://code.google.com/p/android/issues/detail?id=2373
http://code.google.com/p/android/issues/detail?id=5277
Wenn Ihre Anwendung mit dem SingleTask-Flag gestartet wird und Sie sie später über den Startbildschirm oder das Startmenü starten, wird durch diesen nachfolgenden Aufruf eine NEUE Aufgabe erstellt. Sie haben effektiv zwei verschiedene Instanzen Ihrer App den gleichen Stapel bewohnen ... was sehr schnell sehr seltsam wird. Dies scheint zu passieren, wenn Sie Ihre App während der Entwicklung starten (z. B. von Eclipse oder Intellij), sodass Entwickler häufig darauf stoßen. Aber auch über einige der App Store-Aktualisierungsmechanismen (so wirkt sich dies auch auf Ihre Benutzer aus).
Ich habe mich stundenlang durch diese Threads gekämpft, bevor mir klar wurde, dass mein Hauptproblem dieser Fehler war, nicht das beabsichtigte Framework-Verhalten. Ein tolles Schreiben und
Problemumgehung(UPDATE: siehe unten) scheint von Benutzer @kaciula in dieser Antwort zu stammen:Verhalten beim Drücken der Home-Taste
UPDATE Juni 2013 : Monate später habe ich endlich die 'richtige' Lösung gefunden. Sie müssen keine statusbehafteten Start-App-Flags selbst verwalten. Sie können dies anhand des Frameworks erkennen und entsprechend sichern. Ich benutze dies am Anfang meiner LauncherActivity.onCreate:
quelle
onSaveInstanceState
wird aufgerufen, wenn das System Speicher benötigt und eine Anwendung beendet. Es wird nicht aufgerufen, wenn der Benutzer die Anwendung gerade schließt. Daher denke ich, dass der Anwendungsstatus auch in gespeichert werdenonPause
sollte. Er sollte in einem dauerhaften Speicher wiePreferences
oder gespeichert werdenSqlite
quelle
Beide Methoden sind nützlich und gültig und beide eignen sich am besten für verschiedene Szenarien:
onSaveInstanceState()
undonRestoreInstanceState()
in der Regel ausreichend.Wenn Sie die Statusdaten dauerhaft speichern, können sie in einem
onResume()
oderonCreate()
(oder tatsächlich in einem beliebigen Lebenszyklusaufruf) neu geladen werden . Dies kann ein gewünschtes Verhalten sein oder auch nicht. Wenn Sie es in einem Bundle in einem speichernInstanceState
, ist es vorübergehend und eignet sich nur zum Speichern von Daten zur Verwendung in derselben Benutzersitzung (ich verwende den Begriff Sitzung lose), jedoch nicht zwischen Sitzungen.Es ist nicht so, dass ein Ansatz besser ist als der andere, wie alles andere. Es ist nur wichtig zu verstehen, welches Verhalten Sie benötigen, und den am besten geeigneten Ansatz auszuwählen.
quelle
Das Speichern des Staates ist für mich bestenfalls ein Kludge. Wenn Sie persistente Daten speichern müssen, verwenden Sie einfach eine SQLite- Datenbank. Android macht es sooo einfach.
Etwas wie das:
Ein einfacher Anruf danach
quelle
Ich glaube, ich habe die Antwort gefunden. Lassen Sie mich in einfachen Worten sagen, was ich getan habe:
Angenommen, ich habe zwei Aktivitäten, Aktivität1 und Aktivität2, und ich navigiere von Aktivität1 zu Aktivität2 (ich habe einige Arbeiten in Aktivität2 ausgeführt) und wieder zurück zu Aktivität 1, indem ich auf eine Schaltfläche in Aktivität1 klicke. Zu diesem Zeitpunkt wollte ich zu Aktivität2 zurückkehren und meine Aktivität2 in demselben Zustand sehen, in dem ich zuletzt Aktivität2 verlassen habe.
Für das obige Szenario habe ich im Manifest einige Änderungen wie folgt vorgenommen:
Und in der Aktivität1 auf dem Button-Klick-Ereignis habe ich Folgendes gemacht:
Und in Aktivität 2 beim Klicken auf die Schaltfläche habe ich Folgendes getan:
Was nun passieren wird, ist, dass alle Änderungen, die wir an der Aktivität2 vorgenommen haben, nicht verloren gehen und wir die Aktivität2 in demselben Zustand anzeigen können, in dem wir sie zuvor verlassen haben.
Ich glaube, das ist die Antwort und das funktioniert gut für mich. Korrigieren Sie mich, wenn ich falsch liege.
quelle
onSaveInstanceState()
für vorübergehende Daten (wiederhergestellt inonCreate()
/onRestoreInstanceState()
),onPause()
für persistente Daten (wiederhergestellt inonResume()
). Aus technischen Ressourcen von Android:quelle
Wird wirklich
onSaveInstanceState()
aufgerufen, wenn die Aktivität in den Hintergrund tritt.Zitat aus den Dokumenten: "Diese Methode wird aufgerufen, bevor eine Aktivität beendet werden kann, damit sie bei einem späteren Zeitpunkt ihren Status wiederherstellen kann." Quelle
quelle
Um die Boilerplate zu reduzieren, verwende ich Folgendes
interface
undclass
lese / schreibe in einenBundle
zum Speichern des Instanzstatus.Erstellen Sie zunächst eine Schnittstelle, mit der Sie Ihre Instanzvariablen mit Anmerkungen versehen können:
Erstellen Sie dann eine Klasse, in der die Reflektion verwendet wird, um Werte im Bundle zu speichern:
Anwendungsbeispiel:
Hinweis: Dieser Code wurde aus einem Bibliotheksprojekt namens AndroidAutowire angepasst, das unter der MIT-Lizenz lizenziert ist .
quelle
Mittlerweile benutze ich generell nichts mehr
Der Lebenszyklus ist für die meisten Aktivitäten zu kompliziert und nicht notwendig.
Und Google sagt selbst, es ist nicht einmal zuverlässig.
Ich speichere alle Änderungen sofort in den Einstellungen:
In gewisser Weise funktionieren SharedPreferences ähnlich wie Bundles. Und natürlich und zuerst müssen solche Werte aus Präferenzen gelesen werden.
Bei komplexen Daten können Sie SQLite anstelle von Einstellungen verwenden.
Bei Anwendung dieses Konzepts verwendet die Aktivität weiterhin den zuletzt gespeicherten Status, unabhängig davon, ob es sich um ein anfängliches Öffnen mit dazwischen liegenden Neustarts oder ein erneutes Öffnen aufgrund des Backstacks handelte.
quelle
Um die ursprüngliche Frage direkt zu beantworten. savedInstancestate ist null, da Ihre Aktivität niemals neu erstellt wird.
Ihre Aktivität wird nur mit einem Statuspaket neu erstellt, wenn:
Android zerstört Hintergrundaktivitäten, wenn es unter Speicherdruck steht oder wenn es längere Zeit im Hintergrund war.
Wenn Sie Ihr Hallo-Welt-Beispiel testen, gibt es einige Möglichkeiten, die Aktivität zu verlassen und zurückzukehren.
In den meisten Fällen muss die Aktivität nicht neu erstellt werden, wenn Sie nur auf Home drücken und die App dann erneut starten. Es ist bereits im Speicher vorhanden, sodass onCreate () nicht aufgerufen wird.
Unter Einstellungen -> Entwickleroptionen gibt es eine Option namens "Aktivitäten nicht beibehalten". Wenn es aktiviert ist, zerstört Android immer Aktivitäten und erstellt sie neu, wenn sie im Hintergrund sind. Dies ist eine großartige Option, um sie bei der Entwicklung aktiviert zu lassen, da sie das Worst-Case-Szenario simuliert. (Ein Gerät mit wenig Speicher, das Ihre Aktivitäten ständig recycelt).
Die anderen Antworten sind insofern wertvoll, als sie Ihnen die richtigen Methoden zum Speichern des Status beibringen, aber ich hatte nicht das Gefühl, dass sie wirklich geantwortet haben, WARUM Ihr Code nicht wie erwartet funktioniert hat.
quelle
Die Methoden
onSaveInstanceState(bundle)
undonRestoreInstanceState(bundle)
sind nützlich für die Datenpersistenz nur beim Drehen des Bildschirms (Orientierungsänderung).Sie sind nicht einmal gut , während Umschalten zwischen Anwendungen (da die
onSaveInstanceState()
Methode aufgerufen wird , aberonCreate(bundle)
undonRestoreInstanceState(bundle)
wird nicht wieder aufgerufen werden .Für weitere Persistenz Verwendung gemeinsamer Einstellungen. Diesen Artikel lesen
quelle
onCreate
undonRestoreInstanceState
werden nicht aufgerufen, da dasActivity
beim Wechseln von Apps überhaupt nicht zerstört wird, sodass keine Wiederherstellung erforderlich ist. Android ruftonSaveInstanceState
nur für den Fall auf, dass die Aktivität später zerstört wird (was beim Drehen des Bildschirms mit 100% iger Sicherheit geschieht, da sich die gesamte Gerätekonfiguration geändert hat und die Aktivität von Grund auf neu erstellt werden muss).Mein Problem war, dass ich nur während der Anwendungslebensdauer Persistenz benötigte (dh eine einzelne Ausführung, einschließlich des Startens anderer Unteraktivitäten innerhalb derselben App und des Drehens des Geräts usw.). Ich habe verschiedene Kombinationen der oben genannten Antworten ausprobiert, aber nicht in allen Situationen das bekommen, was ich wollte. Am Ende funktionierte es für mich, während onCreate einen Verweis auf den savedInstanceState zu erhalten:
und benutze das, um den Inhalt meiner Variablen zu erhalten, wenn ich ihn brauchte, wie folgt:
Ich benutze
onSaveInstanceState
undonRestoreInstanceState
wie oben vorgeschlagen, aber ich denke, ich könnte auch oder alternativ meine Methode verwenden, um die Variable zu speichern, wenn sie sich ändert (zB mitputBoolean
)quelle
Obwohl die akzeptierte Antwort korrekt ist, gibt es eine schnellere und einfachere Methode, um den Aktivitätsstatus unter Android mithilfe einer Bibliothek namens Icepick zu speichern . Icepick ist ein Anmerkungsprozessor, der sich um den gesamten Boilerplate-Code kümmert, der zum Speichern und Wiederherstellen des Status für Sie verwendet wird.
So etwas mit Icepick machen:
Ist das gleiche wie dies:
Icepick funktioniert mit jedem Objekt, das seinen Status mit a speichert
Bundle
.quelle
Wenn eine Aktivität erstellt wird, wird die Methode onCreate () aufgerufen.
savedInstanceState ist ein Objekt der Bundle-Klasse, das zum ersten Mal null ist, aber bei der Neuerstellung Werte enthält. Um den Status der Aktivität zu speichern, müssen Sie onSaveInstanceState () überschreiben.
Fügen Sie Ihre Werte in das "outState" -Bündelobjekt wie outState.putString ("key", "Welcome Back") ein und speichern Sie es, indem Sie super aufrufen. Wenn die Aktivität zerstört wird, wird ihr Status im Bundle-Objekt gespeichert und kann nach der Neuerstellung in onCreate () oder onRestoreInstanceState () wiederhergestellt werden. Das in onCreate () und onRestoreInstanceState () empfangene Bundle ist identisch.
oder
quelle
Grundsätzlich gibt es zwei Möglichkeiten, diese Änderung umzusetzen.
onSaveInstanceState()
undonRestoreInstanceState()
.android:configChanges="orientation|screenSize"
.Ich empfehle wirklich nicht, die zweite Methode zu verwenden. Da es meiner Erfahrung nach dazu führte, dass die Hälfte des Gerätebildschirms beim Drehen vom Hoch- zum Querformat und umgekehrt schwarz wurde.
Mit der oben genannten ersten Methode können wir Daten beibehalten, wenn die Ausrichtung geändert wird oder eine Konfigurationsänderung auftritt. Ich kenne eine Möglichkeit, wie Sie jede Art von Daten innerhalb des Statusobjekts savedInstance speichern können.
Beispiel: Betrachten Sie einen Fall, wenn Sie das Json-Objekt beibehalten möchten. Erstellen Sie eine Modellklasse mit Gettern und Setzern.
Führen Sie nun in Ihrer Aktivität in den Methoden onCreate und onSaveInstanceState die folgenden Schritte aus. Es wird ungefähr so aussehen:
quelle
Hier ist ein Kommentar aus Steve Moseleys Antwort (von ToolmakerSteve ), der die Dinge relativiert (in der gesamten onSaveInstanceState vs onPause, East Cost vs West Cost Saga).
quelle
Kotlin-Code:
speichern:
und dann in
onCreate()
oderonRestoreInstanceState()
Fügen Sie Standardwerte hinzu, wenn Sie keine Optionals haben möchten
quelle
Um Aktivitätsstatusdaten zu speichern
onCreate()
, müssen Sie zuerst Daten in savedInstanceState speichern, indem Sie dieSaveInstanceState(Bundle savedInstanceState)
Methode überschreiben .Wenn die Aktivitätszerstörungsmethode
SaveInstanceState(Bundle savedInstanceState)
aufgerufen wird und Sie dort Daten speichern, die Sie speichern möchten. Und Sie erhalten dasselbe,onCreate()
wenn die Aktivität neu gestartet wird (savedInstanceState wird nicht null sein, da Sie einige Daten darin gespeichert haben, bevor die Aktivität zerstört wird).quelle
Die einfache und schnelle Lösung dieses Problems ist die Verwendung von IcePick
Richten Sie zuerst die Bibliothek in ein
app/build.gradle
Schauen wir uns nun das folgende Beispiel an, wie der Status in Aktivität gespeichert wird
Es funktioniert für Aktivitäten, Fragmente oder alle Objekte, die ihren Status in einem Bundle serialisieren müssen (z. B. ViewPresenters von Mörser).
Icepick kann auch den Instanzstatuscode für benutzerdefinierte Ansichten generieren:
quelle
Ich bin mir nicht sicher, ob meine Lösung verpönt ist oder nicht, aber ich verwende einen gebundenen Dienst, um den ViewModel-Status beizubehalten. Ob Sie es im Speicher des Dienstes speichern oder beibehalten und aus einer SQLite-Datenbank abrufen, hängt von Ihren Anforderungen ab. Dies ist, was Dienste jeder Art tun, sie bieten Dienste wie das Beibehalten des Anwendungsstatus und die abstrakte allgemeine Geschäftslogik.
Aufgrund von Speicher- und Verarbeitungsbeschränkungen auf Mobilgeräten behandle ich Android-Ansichten ähnlich wie eine Webseite. Die Seite behält nicht den Status bei, sondern ist lediglich eine Präsentationsschichtkomponente, deren einziger Zweck darin besteht, den Anwendungsstatus darzustellen und Benutzereingaben zu akzeptieren. Jüngste Trends in der Web-App-Architektur verwenden das uralte MVC-Muster (Model, View, Controller), wobei die Seite die Ansicht ist, Domänendaten das Modell sind und der Controller sich hinter einem Webdienst befindet. Das gleiche Muster kann in Android verwendet werden, wobei die Ansicht die Ansicht ist, das Modell Ihre Domain-Daten sind und der Controller als Android-gebundener Dienst implementiert ist. Wenn Sie möchten, dass eine Ansicht mit dem Controller interagiert, binden Sie sie beim Starten / Fortsetzen an sie und lösen Sie die Bindung beim Stoppen / Anhalten.
Dieser Ansatz bietet Ihnen den zusätzlichen Vorteil, dass Sie das Prinzip der Trennung von Bedenken durchsetzen können, indem Sie Ihre gesamte Anwendungsgeschäftslogik in Ihren Service verschieben können, wodurch doppelte Logik in mehreren Ansichten reduziert wird und die Ansicht ein weiteres wichtiges Entwurfsprinzip, die Einzelverantwortung, durchsetzen kann.
quelle
Kotlin
Sie müssen Ihre Variablen überschreiben
onSaveInstanceState
undonRestoreInstanceState
speichern und abrufen, um dauerhaft zu seinLebenszyklusdiagramm
Variablen speichern
Variablen abrufen
quelle
Jetzt bietet Android ViewModels zum Speichern des Status. Sie sollten versuchen, diese anstelle von saveInstanceState zu verwenden.
quelle
Es gibt eine Möglichkeit, Android dazu zu bringen, die Status zu speichern, ohne eine Methode zu implementieren. Fügen Sie diese Zeile einfach zu Ihrer Manifest in Activity-Erklärung hinzu:
Es sollte so aussehen:
Hier finden Sie weitere Informationen zu dieser Immobilie.
Es wird empfohlen, dass Android dies für Sie erledigt, als die manuelle Bearbeitung.
quelle
Was sparen und was nicht?
Haben Sie sich jemals gefragt, warum der Text im
EditText
automatisch gespeichert wird, wenn sich die Ausrichtung ändert? Nun, diese Antwort ist für Sie.Wenn eine Instanz einer Aktivität zerstört wird und das System eine neue Instanz neu erstellt (z. B. Konfigurationsänderung). Es wird versucht, es mithilfe einer Reihe gespeicherter Daten des alten Aktivitätsstatus ( Instanzstatus ) neu zu erstellen .
Der Instanzstatus ist eine Sammlung von Schlüssel-Wert- Paaren, die in einem
Bundle
Objekt gespeichert sind .EditText
ListView
usw.Wenn Sie eine andere Variable als Teil des Instanzstatus speichern möchten, sollten Sie die
onSavedInstanceState(Bundle savedinstaneState)
Methode OVERRIDE verwenden.Zum Beispiel
int currentScore
in einer GameActivityWeitere Details zum onSavedInstanceState (Bundle savedinstaneState) beim Speichern von Daten
Welche Option zum Wiederherstellen des Aktivitätsstatus?
ODER
Beide Methoden erhalten dasselbe Bundle-Objekt, sodass es nicht wirklich wichtig ist, wo Sie Ihre Wiederherstellungslogik schreiben. Der einzige Unterschied besteht darin, dass Sie bei der
onCreate(Bundle savedInstanceState)
Methode eine Nullprüfung durchführen müssen, während diese im letzteren Fall nicht benötigt wird. Andere Antworten haben bereits Code-Schnipsel. Sie können sie verweisen.Weitere Details zum onRestoreInstanceState (Bundle savedinstaneState)
Bonus
Das
onSaveInstanceState(Bundle savedInstanceState)
wird vom System nur aufgerufen, wenn der Benutzer beabsichtigt, zur Aktivität zurückzukehren. Zum Beispiel verwenden Sie App X und plötzlich erhalten Sie einen Anruf. Sie wechseln zur Anrufer-App und kehren zur App X zurück. In diesem Fall wird dieonSaveInstanceState(Bundle savedInstanceState)
Methode aufgerufen.Beachten Sie dies jedoch, wenn ein Benutzer die Zurück-Taste drückt. Es wird davon ausgegangen, dass der Benutzer nicht beabsichtigt, zur Aktivität zurückzukehren, und wird daher in diesem Fall
onSaveInstanceState(Bundle savedInstanceState)
vom System nicht aufgerufen. Beachten Sie, dass Sie beim Speichern von Daten alle Szenarien berücksichtigen sollten.Relevante Links:
Demo zum Standardverhalten
Offizielle Android-Dokumentation .
quelle
Jetzt ist es sinnvoll, im Ansichtsmodell zwei Möglichkeiten zu wählen. Wenn Sie die erste als gespeicherte Instanz speichern möchten: Sie können dem Ansichtsmodell Statusparameter wie diesen hinzufügen: https://developer.android.com/topic/libraries/architecture/viewmodel-savedstate#java
oder Sie können Variablen oder Objekte im Ansichtsmodell speichern. In diesem Fall hält das Ansichtsmodell den Lebenszyklus, bis die Aktivität zerstört wird.
quelle
Sie können die
Live Data
undView Model
für Lifecycle Handel
von verwendenJetPack
. siehe diese Referenz:https://developer.android.com/topic/libraries/architecture/livedata
quelle