Ich hatte schlechte Erfahrung mit static class variables
, da ihre Werte beim Entladen der Klasse verloren gehen. Deshalb vermeide ich sie alle.
Jetzt bin ich (wahrscheinlich zu sehr) selbst mit "normalen" Variablen besorgt.
Ich bin mir nicht sicher, ob ihr Wert auch in bestimmten Fällen verloren gehen könnte Umstände wie Unterbrechungen durch einen Anruf, wenig Speicher oder irgendetwas anderes.
Kann ich mich darauf verlassen, dass die Variablen ihre Werte zu 100% behalten? oder
Gewähre ich eine gültige Wiederherstellung für alle Aktivitätsvariablen?
Danke!
Ich hatte schlechte Erfahrungen mit statischen Klassenvariablen, da ihre Werte beim Entladen der Klasse verloren gehen.
Klassen entladen nicht. Ihr Prozess wird beendet , nachdem Sie nichts mehr im Vordergrund haben, wenn Android Speicher zurückfordern muss.
Kann ich mich darauf verlassen, dass die Variablen ihre Werte zu 100% behalten? Oder stelle ich eine gültige Wiederherstellung für alle Aktivitätsvariablen sicher?
Aktivitäten werden benachrichtigt, wenn sie durch einen Aufruf von onPause()
aus dem Vordergrund entfernt werden. Vom Standpunkt dieser Aktivität kann der Prozess jederzeit nach onPause()
bis (möglicherweise) einem entsprechenden onResume()
beendet und die Aktivität verloren gehen.
Sie müssen sich zurücklehnen und über Ihr Datenmodell nachdenken. Angenommen, der Benutzer verlässt Ihre App (z. B. HOME drückt) und kehrt nicht für eine Stunde, einen Tag oder einen Monat zu Ihrer App zurück. Alle Daten, die der Benutzer vernünftigerweise für diesen Zeitraum erhalten würde, müssen in einem persistenten Datenspeicher wie einer Datenbank oder einer Flat-Datei gespeichert werden. Es ist Ihre Aufgabe zu bestimmen, wann diese Daten gespeichert werden - vielleicht, wenn der Benutzer auf die Schaltfläche Speichern klickt, oder vielleicht in onPause()
einer Aktivität, oder vielleicht zu einem anderen Zeitpunkt.
Daten, die an den aktuellen Inhalt des Bildschirms gebunden sind, jedoch nicht für einen Monat Abwesenheit gespeichert werden müssen, können über onSaveInstanceState()
festgehalten werden. Hoffentlich nutzen Sie dies bereits, um Bildschirmdrehungen zu handhaben. Wenn ja, und wenn der Benutzer Ihre Aktivität verlässt, aber in einer Weise, in der er über die ZURÜCK-Schaltfläche zurück zu ihm navigiert (z. B. ein Telefonanruf kommt, dann kommt eine Textnachricht, dann klickt er auf einen Link in einem Textnachricht und rufen Sie den Webbrowser auf, und später BACK den ganzen Weg zurück zu Ihrer App, die in der Zwischenzeit beendet wurde), wird Ihr gespeicherter Instanzstatus wiederhergestellt.
Alles andere - Instanzdatenmitglieder einer Aktivität oder statische Datenmitglieder oder was auch immer - kann verloren gehen, wenn der Benutzer die App verlässt, wenn Android sich dazu entscheidet, Ihren Prozess zu beenden. Daher werden statische Datenelemente normalerweise nur für Kurzzeit-Caches oder für Dinge verwendet, die keine Rolle spielen, wenn sie verloren gehen, wenn der Benutzer HOME drückt oder einen Anruf annimmt oder was auch immer.
Wenn Daten in Ihrer Aktivität gespeichert werden sollen, implementieren Sie onSaveInstanceState.
Ссылка )
Wenn in Ihrem onCreate das übergebene Paket nicht null ist, können Sie davon ausgehen, dass Sie dort einen Status gespeichert und von dort wiederhergestellt haben.
Normale Variablen bestehen weiterhin, aber das Problem ist, dass Sie nie sicher sein können, ob Sie onResuming oder onCreating sind (da Sie keine Kontrolle darüber haben, wann Android einfach loslegt und Sachen aus dem Stapel auf das Fenster wirft. Was zur Zeit nicht verwendet wird, kann vernichtet werden.
Also ... am besten ist es, Dinge auf jede Art und Weise zu speichern, die sinnvoll ist, wenn Sie sie zwischen Orten brauchen, an denen jemand das Gerät logisch in den Schlaf setzt oder es dreht oder einen Anruf bekommt oder irgendetwas anderes unterbricht seine TOP (Ness).
Ich mag die Art und Weise, wie das Paket funktioniert, nicht wirklich. Deshalb habe ich meine Sachen in einem JSON-Objekt gespeichert, das ich in eine Zeichenkette umwandle und einfach als eine flache SharedPreference-Zeichenkette abspeichern würde Bündel wird zusammen mit allem anderen geworfen werden, sobald Ihre Anwendung GCed). Auf diese Weise kann ich es einfach greifen, wann immer ich will, anstatt mit einer Milliarde verschiedener Bundle-Elemente herumzuzappeln, aber das ist natürlich Geschmackssache. Es gibt ein bisschen mehr Arbeit im Voraus, und natürlich etwas mehr Overhead in der Serialisierung / Deserialisierung, aber da es nur in dem seltenen Fall geschieht, dass meine Variablen zerstört werden, ist es wirklich nichts, worüber man sich Sorgen machen muss (außer man hat massive Mengen) von Daten, in diesem Fall sollten Sie sowieso eine Datenbank verwenden).