Ich versuche, den Status eines Activity
mit den Methoden onSaveInstanceState()
und zu speichern und wiederherzustellen onRestoreInstanceState()
.
Das Problem ist, dass es nie in die onRestoreInstanceState()
Methode eingeht . Kann mir jemand erklären, warum das so ist?
android
android-activity
states
BlaBRA
quelle
quelle
Antworten:
Normalerweise stellen Sie Ihren Zustand in wieder her
onCreate()
. Es ist möglich, es auch wiederherzustellenonRestoreInstanceState()
, aber nicht sehr häufig. (onRestoreInstanceState()
wird nachher aufgerufenonStart()
, währendonCreate()
vorher aufgerufen wirdonStart()
.Verwenden Sie die put-Methoden, um Werte zu speichern in
onSaveInstanceState()
:Und stellen Sie die Werte wieder her in
onCreate()
:quelle
onRestoreInstanceState()
genannt wird , nur dann , wenn neu erstellt Aktivität , nachdem sie wurde getötet durch das Betriebssystem. Eine solche Situation tritt auf, wenn:Im Gegensatz dazu: Wenn Sie sich in Ihrer Aktivität befinden und die
Back
Taste auf dem Gerät drücken, wird Ihre Aktivität beendet () (dh als beenden Sie die Desktop-Anwendung) und beim nächsten Start Ihrer App wird sie "frisch" gestartet, dh ohne gespeicherter Zustand, weil Sie ihn absichtlich verlassen haben, als Sie getroffen habenBack
.Eine andere Quelle der Verwirrung ist, dass wenn eine App den Fokus auf eine andere App verliert, diese
onSaveInstanceState()
aufgerufen wird, wenn Sie jedoch zurück zu Ihrer App navigieren, dieseonRestoreInstanceState()
möglicherweise nicht aufgerufen wird. Dies ist der in der ursprünglichen Frage beschriebene Fall, dh wenn Ihre Aktivität während des Zeitraums, in dem andere Aktivitäten imonRestoreInstanceState()
Vordergrund standen, NICHT getötet wurde, wird sie NICHT aufgerufen, da Ihre Aktivität so ziemlich "lebendig" ist.Alles in allem, wie in der Dokumentation angegeben für
onRestoreInstanceState()
:Wie ich es gelesen habe: Es gibt keinen Grund zum Überschreiben, es
onRestoreInstanceState()
sei denn, Sie sind eine UnterklasseActivity
und es wird erwartet, dass jemand Ihre Unterklasse unterordnet.quelle
Der Status, in dem Sie speichern,
onSaveInstanceState()
ist später beimonCreate()
Methodenaufruf verfügbar . Verwenden Sie alsoonCreate
(und seinenBundle
Parameter), um den Status Ihrer Aktivität wiederherzustellen.quelle
Um dieses Problem zu umgehen, können Sie ein Bundle mit den Daten, die Sie verwalten möchten, in der Absicht speichern, mit der Sie Aktivität A starten.
Aktivität A müsste dies an Aktivität B zurückgeben. Sie würden die Absicht in der onCreate-Methode von Aktivität B abrufen.
Eine andere Idee besteht darin, eine Repository-Klasse zu erstellen, um den Aktivitätsstatus zu speichern und jede Ihrer Aktivitäten auf diese Klasse verweisen zu lassen (möglich mithilfe einer Singleton-Struktur). Dies ist jedoch wahrscheinlich schwieriger als es wert ist.
quelle
Die Hauptsache ist, dass, wenn Sie nicht in speichern,
onSaveInstanceState()
dannonRestoreInstanceState()
nicht aufgerufen wird. Dies ist der Hauptunterschied zwischenrestoreInstanceState()
undonCreate()
. Stellen Sie sicher, dass Sie wirklich etwas aufbewahren. Höchstwahrscheinlich ist dies Ihr Problem.quelle
Ich habe festgestellt, dass onSaveInstanceState immer aufgerufen wird, wenn eine andere Aktivität in den Vordergrund tritt. Und so ist onStop.
OnRestoreInstanceState wurde jedoch nur aufgerufen, wenn auch onCreate und onStart aufgerufen wurden. Und onCreate und onStart wurden NICHT immer aufgerufen.
Es scheint also, dass Android die Statusinformationen nicht immer löscht, selbst wenn die Aktivität in den Hintergrund tritt. Es werden jedoch die Lebenszyklusmethoden aufgerufen, um den Status zu speichern, um die Sicherheit zu gewährleisten. Wenn der Status nicht gelöscht wird, ruft Android die Lebenszyklusmethoden nicht auf, um den Status wiederherzustellen, da sie nicht benötigt werden.
Abbildung 2 beschreibt dies.
quelle
Ich denke, dieser Thread war ziemlich alt. Ich erwähne nur einen anderen Fall, der
onSaveInstanceState()
auch genannt wird, wenn Sie anrufenActivity.moveTaskToBack(boolean nonRootActivity)
.quelle
Wenn Sie die Ausrichtung der Aktivität mit
android:configChanges="orientation|screenSize"
und ändernonConfigurationChanged(Configuration newConfig)
,onRestoreInstanceState()
wird sie nicht aufgerufen.quelle
Es ist nicht erforderlich, dass onRestoreInstanceState immer nach onSaveInstanceState aufgerufen wird.
Beachten Sie Folgendes: onRestoreInstanceState wird immer aufgerufen, wenn die Aktivität gedreht wird (wenn die Ausrichtung nicht berücksichtigt wird) oder wenn Sie Ihre Aktivität öffnen und dann andere Apps öffnen, damit Ihre Aktivitätsinstanz vom Betriebssystem aus dem Speicher gelöscht wird.
quelle
In der Dokumentation wird der Status der Aktivitäts-Benutzeroberfläche mithilfe des Status der gespeicherten Instanz wiederhergestellt wie folgt angegeben:
IMO, dies ist klarer als die Überprüfung bei onCreate und passt besser zum Prinzip der Einzelverantwortung.
quelle
In meinem Fall
onRestoreInstanceState
wurde aufgerufen, als die Aktivität nach Änderung der Geräteorientierung rekonstruiert wurde.onCreate(Bundle)
wurde zuerst aufgerufen, aber das Bundle hatte nicht die Schlüssel / Werte, mit denen ich festgelegt habeonSaveInstanceState(Bundle)
.Gleich danach
onRestoreInstanceState(Bundle)
wurde mit einem Bundle aufgerufen, das die richtigen Schlüssel / Werte hatte.quelle
Ich bin gerade darauf gestoßen und habe bemerkt, dass die Dokumentation meine Antwort hatte:
"Diese Funktion wird niemals mit einem Nullzustand aufgerufen."
https://developer.android.com/reference/android/view/View.html#onRestoreInstanceState(android.os.Parcelable)
In meinem Fall habe ich mich gefragt, warum der onRestoreInstanceState bei der ersten Instanziierung nicht aufgerufen wurde. Dies bedeutet auch, dass wenn Sie nichts speichern, es nicht aufgerufen wird, wenn Sie Ihre Ansicht rekonstruieren.
quelle
Ich kann das so machen (sorry, es ist c # nicht Java, aber es ist kein Problem ...):
UND IN IHRER AKTIVITÄT FÜR ERGEBNISSE
ENDLICH
quelle