Speichern des Android Activity-Status mit Save Instance State
Ich habe Android SDK-Plattform, und es ist ein wenig unklar, wie, eine Anwendung zu speichern. 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.
Kommentar zu dem Problem
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)
InformationsquelleAutor der Frage Bernard | 2008-09-30
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 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.).
InformationsquelleAutor der Antwort Reto Meier
Den
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.
InformationsquelleAutor der Antwort Dave L.
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"):
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:InformationsquelleAutor der Antwort Steve Moseley
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 varible/UI-control-Daten für die Lebensdauer der Anwendung (also vorübergehend), die Instanz Staat Bundle
Speichern von lokalen varible/UI-Steuerelement Daten zwischen Anwendungsinstanzen (dh dauerhaft) unter Verwendung von Shared Preferences
Halten Objektinstanzen im Speicher aktiv zwischen Aktivitäten innerhalb einer Anwendung, Lebensdauer der Verwendung Beibehalten Non-Configuration Instanz
InformationsquelleAutor der Antwort Martin Belcher - Eigo
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
Abhilfe(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:
InformationsquelleAutor der Antwort Mike Repass
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
InformationsquelleAutor der Antwort Fedor
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.
InformationsquelleAutor der Antwort David
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
InformationsquelleAutor der Antwort Mike A.
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 (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 gemacht wie:
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.
InformationsquelleAutor der Antwort roy mathew
onSaveInstanceState()
für transiente Daten (renoviert inonCreate()
/onRestoreInstanceState()
),onPause()
für persistente Daten (renoviert inonResume()
).Von Android technische Ressourcen:
InformationsquelleAutor der Antwort Ixx
Neuerstellung einer Aktivität
Gibt es ein paar Szenarien, in denen Ihre Aktivität zerstört wird, die durch normalen app-Verhalten, wie wenn der Benutzer die Zurück-Taste drückt oder Ihre Aktivität signalisiert seine eigene Zerstörung durch den Aufruf
finish()
. Das system kann auch zerstören Sie Ihre Aktivität, wenn es gerade beendet und wurde nicht in eine lange Zeit verwendet oder die Vordergrund-Aktivität erfordert mehr Ressourcen, damit das system muss heruntergefahren Hintergrundprozesse zu erholen Speicher.Wenn Ihr
activity
ist zerstört, weil der Benutzer die Taste Zurück oder dieactivity
beendet sich das system das Konzept, dassActivity
Instanz ist für immer verschwunden, da sich das Verhalten zeigt die Aktivität nicht mehr benötigt wird. Wenn das system jedoch zerstört die Aktivität aufgrund von system-Einschränkungen (und nicht als normale app-Verhalten), auch wenn die eigentliche Tätigkeit Instanz gegangen ist, merkt sich das system, dass es existiert so dass, wenn der Benutzer zurück navigiert, legt das system eine neue Instanz der Tätigkeit mit einem Satz von gespeicherten Daten, beschreibt den Zustand der Aktivität, wenn es wardestroyed
. Die gespeicherten Daten, die das system verwendet, um den vorherigen Zustand wiederherzustellen, wird als "Instanz-Status" und ist eine Sammlung von Schlüssel-Wert-Paare gespeichert, die im Bundle-Objekt.Speichern zusätzliche Daten über die Aktivität, Status, müssen Sie überschreiben die onSaveInstanceState () - callback-Methode. Das system ruft diese Methode auf, wenn der Benutzer verlässt Ihre Tätigkeit und übergibt ihm den Bundle-Objekt gespeichert für den Fall, dass Sie Ihre Aktivität zerstört wird unerwartet beendet. Wenn das system erstellen muss die Aktivität Instanz später, übergibt er das gleiche Bundle-Objekt sowohl für die
onRestoreInstanceState()
undonCreate()
Methoden.Als das system beginnt, stoppen Sie Ihre Aktivität, es ruft
onSaveInstanceState()
(1) so können Sie festlegen, welche zusätzlichen Daten Sie speichern möchten, im Falle der Aktivität Instanz erneut erstellt werden muss. Wenn die activity zerstört wird und die gleiche Instanz neu erstellt werden muss, übergibt das system den Staat definierten Daten (1) sowohl dieonCreate()
Methode (2) und dieonRestoreInstanceState()
Methode (3).Speichern Sie Ihre
Activity
ZustandAls Ihre Aktivität beginnt zu stoppen, ruft das system
onSaveInstanceState()
so kann Ihre Aktivität speichern Status-Informationen mit einer Auflistung von Schlüssel-Wert-Paaren. Die Standardimplementierung dieser Methode speichert Informationen über den Zustand der Aktivität view-Hierarchie, wie Sie den text in eineEditText
widget oder die scroll-position desListView
.Speichern zusätzliche Status-Informationen für Ihre Tätigkeit, die Sie implementieren müssen
onSaveInstanceState()
und fügen Sie Schlüssel-Wert-Paaren auf das Bundle-Objekt. Zum Beispiel:Achtung: rufen Sie Immer die Oberklasse Umsetzung von
onSaveInstanceState()
also die default-Implementierung sparen können den Status der view-Hierarchie.Wiederherstellung Ihrer
Activity
ZustandWenn Ihre Aktivität wird wiederhergestellt, nachdem es zuvor war zerstört, Sie erholen Ihre gespeicherten Zustand von dem Bündel, das system übergibt Ihre Aktivität. Sowohl die
onCreate()
undonRestoreInstanceState()
callback-Methoden erhalten die gleichenBundle
enthält die Instanz-Status-Informationen.Weil die
onCreate()
- Methode aufgerufen wird, ob das system ist das erstellen einer neuen Instanz der Aktivität oder Neuerstellen einer vorherigen, müssen Sie überprüfen, ob der Staat Bundle null ist, bevor Sie versuchen, es zu Lesen. Wenn es null ist, dann ist das system erstellen einer neuen Instanz der Aktivität, anstatt die Wiederherstellung einer früheren eine, die zerstört wurde.Zum Beispiel, hier ist, wie können Sie wieder einige Stand-Daten in
onCreate()
:Anstelle der Wiederherstellung der Zustand, in
onCreate()
Sie können wählen, zu implementierenonRestoreInstanceState()
, die das system ruft nach deronStart()
Methode. Das system ruftonRestoreInstanceState()
nur, wenn es einen gespeicherten Zustand wiederherstellen, so brauchen Sie nicht, um zu überprüfen, ob das Bundle ist null:InformationsquelleAutor der Antwort Ravi Vaghela
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"InformationsquelleAutor der Antwort u-foka
Mittlerweile Mach ich im Allgemeinen keine Verwendung mehr
live-Zyklus 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 werden rot 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.
InformationsquelleAutor der Antwort stefan bachert
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.
InformationsquelleAutor der Antwort Jared Rummler
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, 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.
InformationsquelleAutor der Antwort Jared Kells
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
InformationsquelleAutor der Antwort Mahorad
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
)InformationsquelleAutor der Antwort torwalker
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
.InformationsquelleAutor der Antwort Kevin Cronly
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:
InformationsquelleAutor der Antwort Krishna
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
InformationsquelleAutor der Antwort Mansuu....
Hier ist ein Kommentar von Steve Moseley's Antwort (von ToolmakerSteve) , setzt die Dinge in Perspektive (in der ganzen onSaveInstanceState vs onPause, east cost vs west Kosten-saga)
InformationsquelleAutor der Antwort sαmosΛris
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)InformationsquelleAutor der Antwort ascii_walker
Nicht sicher, ob meine Lösung ist verpönt oder nicht, aber ich verwende ein gebundenes service beibehalten ViewModel Zustand. Ob Sie in Speicher speichern im service-oder beibehalten und abrufen aus einer SqlLite-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 das 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 gut ... der Blick, das model die Daten Ihrer domain und den 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.
InformationsquelleAutor der Antwort ComeIn
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:
InformationsquelleAutor der Antwort THANN Phearum
Kotlin-code:
sparen:
und dann in
onCreate()
oderonRestoreInstanceState()
Add default-Werte, wenn Sie nicht wollen, haben Optionen
InformationsquelleAutor der Antwort Rafols