So speichern Sie ein Android-Aktivitäts-Status mit speichern der Instanz Staat?
Habe ich gearbeitet, auf der Android SDK-Plattform, und es ist ein wenig unklar, wie, eine Anwendung zu speichern ist-Zustand. So gegeben, diese kleine re-tooling die "Hello, Android" Beispiel:
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);
}
}
Dachte ich, es wäre genug für den einfachsten Fall, aber es reagiert immer mit der ersten Nachricht, egal, wie ich zu navigieren Weg von der app.
Ich bin sicher, die Lösung ist so einfach wie das überschreiben onPause
oder so, aber ich habe schon gestöbert entfernt in der Dokumentation für 30 Minuten oder so und habe nicht gefunden was offensichtlich ist.
- Wann ist savedInstanceState == null und wenn es nicht null ist ?
- Sie sind explizit die Zerstörung Ihrer Aktivität, indem Sie - wie Sie sagte, verlassen Sie, wie, indem Sie back drücken. Eigentlich ist das Szenario, in dem diese "savedInstanceState" verwendet wird, ist bei Android zerstört, die Ihre Aktivität für die Erholung. Für Herzen lag: Wenn Sie ändern Sie die Sprache Ihres Telefons, während die Aktivität ausgeführt wurde (und damit die verschiedenen Ressourcen aus dem Projekt geladen werden). Ein weiteres sehr häufiges Szenario ist, wenn Sie Ihr Telefon drehen auf die Seite, so dass die Aktivität neu erstellt und angezeigt, in der Landschaft.
- Auf die zweite Nachricht, aktivieren Sie "Don' T keep activities" in den dev-Optionen. Drücken Sie eine home-Taste und zurück von recents.
- dies ist sehr hilfreich developer.android.com/training/basics/activity-lifecycle/...
- Sie können es tun mit : onSaveInstanceState(Bundle savedInstanceState)
- Ich denke also, dass jetzt keine Notwendigkeit des Sparens savedInstance wenn Sie life-cycle-aware-Architektur Komponenten wie ViewModel-das ist die bessere Wahl für die Lösung Thema wie die Konfigurationen ändern Problem.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie zum überschreiben
onSaveInstanceState(Bundle savedInstanceState)
und schreiben Sie die Anwendung Status-Werte, die Sie ändern möchten, um dieBundle
parameter wie diese:Bundle ist im wesentlichen eine Möglichkeit zum speichern eines NVP (Name-Value-Pair-Mädchen") anzeigen, und es wird übergeben, um
onCreate()
und auchonRestoreInstanceState()
wo würden Sie dann extrahieren Sie die Werte wie diese:Würden Sie in der Regel verwenden Sie dieses Verfahren zum speichern von Instanzen-Werte für Ihre Anwendung (Auswahl, nicht gespeicherte Texte, etc.).
onRestoreInstanceState
ist ebenfalls verfügbar, um Fragmente.onCreate
, Wann sollten wir nutzenonRestoreInstanceState
?onSaveInstanceState
fast nutzlos, außer für den Fall von änderungen der Bildschirmausrichtung. In fast allen anderen Fällen können Sie nie auf Sie verlassen und müssen manuell speichern Sie Ihre UI-state woanders. Oder verhindert, dass Ihre app aus, die getötet werden durch überschreiben der ZURÜCK-button Verhalten. Ich verstehe nicht, warum Sie noch umgesetzt, wie dies in den ersten Platz. Total unintuitiv. Und Sie können nicht haben, dass das Bundle-system geben, Sie zu speichern, die Dinge in die außer in dieser ganz besonderen Methode.savedInstanceState.putBoolean(STATE_MY_BOOLEAN, true);
View
s zugewiesenen ids. Aus deronSaveInstanceState
docs: "Die default-Implementierung kümmert sich um die meisten der UI-pro-Instanz-Zustand für Sie telefonischonSaveInstanceState()
auf jede Ansicht in der Hierarchie, hat eine id und die Speicherung der id des aktuell fokussierten Ansicht (alle, die wieder durch die default-Implementierung vononRestoreInstanceState(Bundle)
)"onCreate
Arbeit für diesen Fall?onCreate
ist auch als Orientierung für Veränderungen.onRestoreInstanceState(Bundle)
weil das bundle ist nicht null, in der Erwägung, dass inonCreate(Bundle)
Sie müssten zu überprüfen. Es gibt eine gute Erklärung des Unterschieds findest du hier: stackoverflow.com/a/14676555/494879Den
savedInstanceState
ist nur für das speichern des Zustands im Zusammenhang mit einer Laufenden Instanz einer Aktivität, zum Beispiel aktuelle navigation oder Auswahl-info, so dass, wenn Android zerstört und erschafft eine Aktivität, kann es wieder wie es vorher war. Finden Sie in der Dokumentation füronCreate
undonSaveInstanceState
Mehr lange gelebt Zustand, erwägen Sie die Verwendung einer SQLite-Datenbank, einer Datei oder Einstellungen. Sehen Speichern Von Persistenten Zustand.
Beachten Sie, dass es NICHT sicher zu verwenden
onSaveInstanceState
undonRestoreInstanceState
für persistente Daten, laut der Dokumentation auf Aktivität Staaten in http://developer.android.com/reference/android/app/Activity.html.Heißt das Dokument (in den "Activity Lifecycle" Abschnitt):
In anderen Worten, setzen Sie Ihre save - /restore-code für die persistenten Daten in
onPause()
undonResume()
!BEARBEITEN: Für die weitere Klärung, hier ist die
onSaveInstanceState()
Dokumentation:onPause()
Sie benötigen, um Shop inSharedPreferences
oder Datenbank oder cloud. Siehe :http://developer.android.com/guide/topics/data/data-storage.html#pref für Beispiele. Sie verwendenonStop()
aber der code ist der gleiche.onSaveInstanceState()
und Freunde sind nur unsicher, wenn Sie versuchen, verwenden Sie für persistente Daten zu speichern. Hoffentlich macht die Antwort hinreichend genau und informativ.Mein Kollege schrieb einen Artikel zu erklären, den Zustand der Anwendung auf Android-Geräten einschließlich der Erklärungen auf der Aktivität-Lebenszyklus und-Zustand Informationen, wie zum speichern von Status-Informationen, und speichern Staat
Bundle
undSharedPreferences
und werfen Sie einen Blick auf hier.Den Artikel umfasst drei Ansätze:
Speichern von lokalen Variablen/UI-control-Daten für die Lebensdauer der Anwendung (d.h. vorübergehend) mit einer Instanz Staat bundle
Speichern von lokalen Variablen/UI-Steuerelement Daten zwischen Applikations-Instanzen (D. H. dauerhaft) unter Verwendung von shared preferences
Halten Objektinstanzen im Speicher aktiv zwischen Aktivitäten innerhalb einer Anwendung, Leben mit einer beibehaltenen nicht-configuration Instanz
editor.apply()
ist schneller alseditor.commit()
.Dies ist ein klassisches 'gotcha' von Android Entwicklung. Es gibt hier zwei Probleme:
Browsing über alle diese threads, ich vermute, dass viel von der Zeit, die die Entwickler sprechen über diese zwei verschiedene Dinge gleichzeitig ... daher die Verwirrung und Berichte von "das funktioniert nicht für mich".
Zunächst ist zu klären, den 'soll' - Verhalten: onSaveInstance und onRestoreInstance sind zerbrechlich und nur für den vorübergehenden Zustand. Die bestimmungsgemäße Verwendung (afaict) zu behandeln Aktivität Erholung, wenn das Telefon gedreht wird (Ausrichtung ändern). In anderen Worten, die beabsichtigte Verwendung ist, wenn Sie Ihre Tätigkeit noch logisch 'on top', aber trotzdem muss erneut instanziiert werden, indem das system. Die gespeicherten Bundle wird nicht dauerhaft außerhalb des Prozess - /memory/gc, so dass Sie nicht wirklich auf diese angewiesen sind, wenn Ihre Aktivität geht in den hintergrund. Ja, vielleicht ist Ihre Tätigkeit das Gedächtnis wird überleben seiner Reise in den hintergrund und die Flucht GC, aber das ist nicht zuverlässig (noch ist es vorhersehbar).
Also, wenn Sie haben ein Szenario, wo es sinnvoll ist "user" Fortschritt "oder Zustand, der beibehalten werden sollte zwischen "startet" der Anwendung ist, die Anleitung zu verwenden, onPause und onResume. Sie müssen wählen Sie und bereiten Sie eine persistente Speicherung selbst.
ABER - es ist ein sehr verwirrender Fehler, erschwert dies alles. Details sind hier:
http://code.google.com/p/android/issues/detail?id=2373
http://code.google.com/p/android/issues/detail?id=5277
Grundsätzlich, wenn Ihre Anwendung gestartet wird mit der SingleTask-flag, und dann später, Sie starten Sie es von der Startseite oder in der launcher-Menü, dann, dass nachfolgende Aufruf erstellen Sie eine NEUE Aufgabe ... Sie werden effektiv zwei unterschiedliche Instanzen der app, die die gleichen Stapel ... das aber sehr seltsam, sehr schnell. Dies scheint zu passieren, wenn Sie starten Sie Ihre app während der Entwicklung (z.B. von Eclipse oder Intellij), so dass sich Entwickler in dieser eine Menge. Aber auch durch einige der app-store-update-Mechanismen (so es eine Wirkung auf Ihre Nutzer als auch).
Ich kämpfte sich durch diese threads für Stunden, bevor ich erkannte, dass meine Haupt-Frage war dieser bug, nicht den vorgesehenen Rahmen Verhalten. Ein großer writeup und
workaround(UPDATE: siehe unten) scheint von user @kaciula in dieser Antwort:Home-Taste drücken Verhalten
UPDATE Juni 2013: Monate später, habe ich endlich den "richtigen" Lösung. Sie brauchen nicht zu bewirtschaften, stateful startedApp flags selbst sind, können Sie erkennen, diese aus dem Rahmen und die Kaution entsprechend. Ich benutze dies in der Nähe der Beginn meiner LauncherActivity.onCreate:
onSaveInstanceState
wird aufgerufen, wenn das system benötigt Speicher und beendet eine Anwendung. Es wird nicht aufgerufen, wenn der Benutzer die Anwendung schließt. Also ich denke, den Zustand der Anwendung sollte auch gespeichert werden, inonPause
Es sollte gerettet werden, um einige persistente Speicher wiePreferences
oderSqlite
Beide Methoden sind nützlich und gültig ist, und beide sind am besten geeignet für verschiedene Szenarien:
onSaveInstanceState()
undonRestoreInstanceState()
ist in der Regel ausreichend.Wenn Sie den Zustand sichern von Daten in einer beständigen Art und Weise, es kann nachgeladen werden, die in einem
onResume()
oderonCreate()
(oder eigentlich auf jeder lifecycle-call). Dies kann oder möglicherweise nicht gewünschtes Verhalten. Wenn Sie es speichern in einem bundle-in eineInstanceState
ist, dann ist es vergänglich und ist nur geeignet für die Speicherung von Daten zur Verwendung in der gleichen Benutzer 'Sitzung' (ich verwende den Begriff session-Locker), aber nicht zwischen den "Sitzungen".Ist es nicht, dass ein Ansatz besser ist als das andere, wie alles, es ist nur wichtig zu verstehen, was Verhalten, die Sie benötigen und wählen Sie die am besten geeignete Ansatz.
Status speichern ist ein Schlamassel, am besten soweit ich bin besorgt. Wenn Sie brauchen, um zu speichern persistenter Daten, verwenden Sie einfach einen SQLite Datenbank. Android macht es SOOO einfach.
Etwas wie dieses:
Einen einfachen Anruf nach, dass
Denke ich, dass ich die Antwort gefunden. Lassen Sie mich sagen, was ich getan haben, in einfachen Worten:
Angenommen ich habe zwei Aktivitäten, activity1 und activity2 und ich bin mit der Navigation von activity1 activity2 zu (ich habe getan, einige Werke in activity2) und wieder zurück zur übung 1, indem Sie auf eine Schaltfläche in activity1. Jetzt, an diesem Punkt wollte ich zurück zu gehen, um activity2, und ich will sehen, wie meine activity2 in der gleichen Bedingung, als ich den letzten Links activity2.
Für die oben genannten Szenario, was ich getan habe, ist, dass in der manifest habe ich einige änderungen wie diese:
Und in der activity1 auf die Schaltfläche click-Ereignis habe ich wie folgt vorgenommen:
Und in activity2 auf button-click-Ereignis habe ich wie folgt vorgenommen:
Nun, was passieren wird, ist, dass unabhängig von den änderungen, die wir vorgenommen haben, in der activity2, nicht verloren gehen, und wir können activity2 in den gleichen Zustand wie wir linken früher.
Ich glaube, das ist die Antwort, und das funktioniert gut für mich. Korrigieren Sie mich, wenn ich falsch bin.
onSaveInstanceState()
für transiente Daten (renoviert inonCreate()
/onRestoreInstanceState()
),onPause()
für persistente Daten (renoviert inonResume()
).Von Android technische Ressourcen:
Wirklich
onSaveInstance
Zustand callen, wenn die Aktivität geht in den hintergrundZitat aus der Dokumentation:
"die Methode
onSaveInstanceState(Bundle)
aufgerufen wird, bevor die Aktivität in solch einen hintergrund-Zustand"Zu verringern, boilerplate ich verwende die folgenden
interface
undclass
Lesen/schreiben auf einemBundle
für das sparen von Instanz-Zustand.Erstellen Sie zuerst eine Schnittstelle, die verwendet werden, um kommentieren Sie Ihre Instanz-Variablen:
Erstellen Sie dann eine Klasse, wo die Reflexion verwendet werden, um Werte zu speichern, um das bundle:
Beispiel:
Hinweis: Dieser code wurde angepasst von einer Bibliothek-Projekt mit dem Namen AndroidAutowire unter der Lizenz der MIT-Lizenz.
Mittlerweile Mach ich im Allgemeinen keine Verwendung mehr
Den Lebenszyklus ist für die meisten Tätigkeiten zu kompliziert und nicht notwendig.
- Und Google erklärt selbst, es ist auch NICHT zuverlässig.
Mein Weg ist, um änderungen zu speichern sofort in den Einstellungen:
In irgendeiner Weise SharedPreferences arbeiten ähnlich wie Bundles.
Und natürlich, zuerst auf solche Werte zu Lesen von Einstellungen.
Im Fall von komplexen Daten, die Sie verwenden SQLite anstelle von Einstellungen.
Wenn Sie dieses Konzept, die Aktivität weiterhin die zuletzt gespeicherten Zustand, unabhängig davon, ob es war ein erstes öffnen Sie mit Neustarts zwischendurch oder ein wieder öffnen, da die back-stack.
Antwort auf die ursprüngliche Frage direkt. savedInstancestate ist null, weil Ihre Tätigkeit ist niemals neu erstellt.
Ihre Tätigkeit wird nur neu erstellt werden, die einen Zustand als Paket:
Wird Android vernichten hintergrund Aktivitäten, wenn Sie über genügend Arbeitsspeicher verfügt oder nachdem Sie schon in den hintergrund-für einen längeren Zeitraum.
Beim testen Sie Ihr hello-world-Beispiel es gibt ein paar Wege zu verlassen und zurückzukehren, um die Aktivität.
In den meisten Fällen, wenn Sie nur mit drücken der home und dann starten Sie die app erneut, die Aktivitäten müssen nicht neu erstellt werden. Es existiert bereits im Speicher, so onCreate() wird nicht aufgerufen werden.
Gibt es eine option unter Einstellungen -> Entwickler-Optionen "Don' T keep activities". Wenn es aktiviert wird Android immer zerstören, Aktivitäten und erstellen Sie, wenn Sie im hintergrund. Dies ist eine großartige option zu verlassen, aktiviert bei der Entwicklung, weil es simuliert den worst-case-Szenario. ( Eine low-memory-Geräte recycling Ihrer Tätigkeiten die ganze Zeit ).
Die anderen Antworten sind wertvoll, die Sie vermitteln Ihnen die richtigen Möglichkeiten, um zu speichern Zustand, aber ich hatte nicht das Gefühl, Sie wirklich beantwortet, WARUM dein code nicht funktioniert in der Weise, die Sie erwartet.
Den
onSaveInstanceState(bundle)
undonRestoreInstanceState(bundle)
Methoden sind nützlich für die Dauerhaftigkeit der Daten lediglich beim drehen des Bildschirms (Ausrichtung ändern).Sie sind nicht einmal gut, beim Umschalten zwischen Anwendungen (da die
onSaveInstanceState()
Methode wird aufgerufen, aberonCreate(bundle)
undonRestoreInstanceState(bundle)
wird nicht erneut aufgerufen.Für mehr Ausdauer verwenden Sie gemeinsame Vorlieben. Lesen Sie diesen Artikel
onCreate
undonRestoreInstanceState
werden nicht genannt, weil dieActivity
wird nicht zerstört, wenn Sie wechseln von apps, so gibt es keine Notwendigkeit zur Wiederherstellung nichts. Android AnrufeonSaveInstanceState
nur im Fall, dass die Activity zerstört wird später (das passiert mit 100% Sicherheit beim drehen des Bildschirm, da die gesamten Geräte-Konfiguration geändert hat, und die Aktivität muss neu erstellt werden, von Grund auf).Mein problem war, dass ich brauchte Beharrlichkeit, die nur während der Lebensdauer der Anwendung (D. H. eine einzelne Ausführung einschließlich der Start-weitere sub-Aktivitäten innerhalb der gleichen app und drehen des Geräts, etc.). Ich habe versucht, verschiedene Kombinationen der oben genannten Antworten, aber nicht bekommen, was ich wollte, in allen Situationen. Am Ende, was für mich gearbeitet wurde um einen Verweis auf die savedInstanceState während onCreate:
verwenden, um zu erhalten der Inhalt meiner variable, wenn ich Sie brauchte, entlang der Linien von:
Benutze ich
onSaveInstanceState
undonRestoreInstanceState
wie oben vorgeschlagen, aber ich denke, ich könnte auch oder alternativ meine Methode zum speichern der Variablen, wenn Sie sich ändert (z.B. mitputBoolean
)Obwohl die akzeptierte Antwort ist richtig, es gibt eine schnellere und einfachere Methode zum speichern des Activity-Status auf Android mit einer Bibliothek namens Icepick. Icepick ist ein annotation-Prozessor, der kümmert sich um den ganzen boilerplate-code verwendet zum speichern und wiederherstellen der Staat für Sie.
Sowas mit Icepick:
Ist das gleiche wie dies:
Icepick funktioniert mit jedem Objekt speichert seinen Zustand mit einem
Bundle
.Wann wird eine Aktivität erzeugt, es ist onCreate () - Methode aufgerufen wird.
savedInstanceState Objekt der Bundle-Klasse, die null zum ersten mal, aber es enthält Werte, wenn es neu erstellt wird. Zum speichern der Tätigkeit Stand, die Sie überschreiben müssen, onSaveInstanceState().
legen Sie Ihre Werte in "outState" Bundle-Objekt wie outState.putString("key","Willkommen Zurück") und sparen Sie durch den Aufruf super.
Wenn Aktivität zerstört werden, es ist Staat gerettet werden, in Bundle-Objekt und kann wiederhergestellt werden, nachdem die Erholung in der onCreate () - oder onRestoreInstanceState(). Bundle erhalten in onCreate() und onRestoreInstanceState() sind die gleichen.
oder
Grundsätzlich gibt es zwei Wege zu implementieren, dies zu ändern.
onSaveInstanceState()
undonRestoreInstanceState()
.android:configChanges="orientation|screenSize"
.Ich wirklich nicht empfehlen die Verwendung der zweiten Methode. Da in einem meiner Erfahrung es war, die die Hälfte des Display schwarz beim drehen vom hoch-ins Querformat und Umgekehrt.
Unter Verwendung der ersten Methode, die oben erwähnten , wir können das beibehalten von Daten, wenn die Ausrichtung geändert wird oder irgendeine config-änderung geschieht.
Ich kenne einen Weg, in dem Sie speichern können jede Art von Daten in savedInstance state-Objekt.
Beispiel: Betrachten Sie einen Fall, wenn Sie wollen, bestehen Json-Objekt.
erstellen Sie eine Modell-Klasse mit Getter und setter .
Jetzt in Ihrer Tätigkeit in onCreate und onSaveInstanceState-Methode tun die folgende. Es wird in etwa so Aussehen:
Hier ist ein Kommentar von Steve Moseley's Antwort (von ToolmakerSteve), das setzt die Dinge in Perspektive (in der ganzen onSaveInstanceState vs onPause, east cost vs west Kosten-saga)
Kotlin-code:
sparen:
und dann in
onCreate()
oderonRestoreInstanceState()
Add default-Werte, wenn Sie nicht wollen, haben Optionen
Bekommen Aktivitäts-Status gespeicherten Daten in
onCreate()
müssen Sie zuerst speichern von Daten in savedInstanceState durch überschreibenSaveInstanceState(Bundle savedInstanceState)
Methode.Wenn Aktivität zerstören
SaveInstanceState(Bundle savedInstanceState)
Methode wird aufgerufen, und dort Daten speichern, die Sie speichern möchten. Und Sie bekommen dasselbe inonCreate()
wenn Aktivität neu starten.(savedInstanceState nicht null sein, da Sie gespeichert haben, einige Daten in Sie, bevor die Aktivität zerstört)Einfach und schnell zu lösen dieses problem ist mit IcePick
Erste, den setup der Bibliothek in
app/build.gradle
Nun, schauen wir uns das Beispiel unten, wie save state in der Aktivität
Es funktioniert für Aktivitäten, Fragmente oder jedes Objekt, das serialisieren muss seinen Zustand auf ein Bundle (z.B. Mörtel ist ViewPresenters)
Icepick kann auch erzeugen Sie die Instanz state code für benutzerdefinierte Ansichten:
Nicht sicher, ob meine Lösung ist verpönt oder nicht, aber ich benutze ein gebundenes service beibehalten ViewModel Zustand. Ob Sie in Speicher speichern im service-oder beibehalten und abrufen aus einer SQLite-Datenbank hängt von Ihren Anforderungen ab. Dies ist, was die Dienste von Geschmack tun, Sie bieten Dienstleistungen wie die Pflege, den Zustand der Anwendung und abstrakte gemeinsame business-Logik.
Wegen Speicher und Verarbeitung von Beschränkungen auf mobilen Geräten, ich behandle Android-Ansichten in einer ähnlichen Weise zu einer web-Seite. Die Seite nicht pflegen Zustand, es ist eine Reine Präsentations-layer-Komponente, deren einziger Zweck es ist, um den Zustand der Anwendung und Benutzereingaben akzeptieren. Aktuelle trends in der web app Architektur verwenden Sie die Alter-alte Modell, View, Controller (MVC) - Muster, in dem die Seite ist der Ansicht, der domain-Daten ist das Modell und der controller sitzt hinter einem web service. Das gleiche Muster eingesetzt werden können, in Android mit der Ansicht seiend, gut ... der Blick, das model ist Ihre domain-Daten, und der Controller implementiert ist, als ein Android-gebunden-service. Wenn Sie möchten, eine Ansicht, um die Interaktion mit dem controller, binden Sie es auf starten/fortsetzen und lösen Sie auf stop/pause.
Dieser Ansatz gibt Ihnen den zusätzlichen bonus für die Durchsetzung der Trennung der Anliegen-design-Prinzip, dass alle von Euch die Geschäftslogik der Anwendung verschoben werden können, in Ihre service-das senkt die duplizierte Logik über mehrere Ansichten und ermöglicht die Ansicht durchzusetzen, ein weiteres wesentliches design-Prinzip der Einzigen Verantwortung.
Nun bietet Android ViewModels für den Status speichern, sollten Sie versuchen zu verwenden, statt saveInstanceState.
Kotlin
Müssen Sie überschreiben
onSaveInstanceState
undonRestoreInstanceState
zum speichern und abrufen von Variablen, die Sie wollen, beharrlich zu seinLife-cycle-graph
Speichern von Variablen
Abrufen von Variablen
Was zu speichern und was nicht?
Sich jemals gefragt, warum der text in der
EditText
wird automatisch gespeichert, während eine Orientierung ändern? Gut, diese Antwort ist für Sie.Wenn eine Instanz einer Aktivität zerstört wird und das System erstellt eine neue Instanz (Z. B. änderung der Konfiguration). Es wird versucht, es neu zu erstellen mit einem Satz von gespeicherten Daten der alten Schaltzustand (Instanz Staat).
Instanz Staat ist eine Sammlung von Schlüssel-Wert - - Paare gespeichert, die in einem
Bundle
Objekt.EditText
ListView
usw.Wenn Sie brauchen, einer anderen variable gespeichert werden als ein Teil der Instanz-Zustand sollten Sie ÜBERSCHREIBEN
onSavedInstanceState(Bundle savedinstaneState)
Methode.Beispielsweise
int currentScore
in eine GameActivityMehr Details über die onSavedInstanceState(Bundle savedinstaneState) beim speichern von Daten
, Was Sie wählen, für die Wiederherstellung der Aktivität Zustand?
ODER
Beide Methoden erhalten die gleichen Bundle-Objekt, also spielt es eigentlich keine Rolle, wo Sie schreiben, Ihre Wiederherstellung Logik. Der einzige Unterschied ist, dass in
onCreate(Bundle savedInstanceState)
Methode werden Sie ein null-check, während es nicht benötigt wird, im letzteren Fall. Die anderen Antworten haben schon code-Schnipsel. Sie können finden Sie.Mehr Details über die onRestoreInstanceState(Bundle savedinstaneState)
Bonus
Den
onSaveInstanceState(Bundle savedInstanceState)
aufgerufen wird, indem Sie das system nur, wenn der Benutzer beabsichtigt, wieder zu kommen, um die Aktivität. Sie sind zum Beispiel mit der App X-und plötzlich Sie einen Anruf erhalten. Verschieben Sie die Anrufer-app und kommen zurück, um die app X. In diesem Fall dieonSaveInstanceState(Bundle savedInstanceState)
- Methode aufgerufen wird.Aber Bedenken Sie dies, wenn ein Benutzer die zurück-Taste drückt. Es wird davon ausgegangen, dass der Benutzer nicht die Absicht wieder zu kommen, um die Aktivität, daher in diesem Fall
onSaveInstanceState(Bundle savedInstanceState)
wird nicht vom system aufgerufen wird.Punkt ist, sollten Sie berücksichtigen alle die Szenarien, während die Speicherung der Daten.
Relevante links:
Demo auf Standard-Verhalten
Android-Offizielle Dokumentation.