2013-11-05 16 views
7

In Android empfiehlt Google uns, die globalen Variablen in der Anwendung zu speichern. Aber es gibt ein Problem, wenn das Android-Betriebssystem die Anwendung aufgrund von wenig Arbeitsspeicher beendet, wird die Anwendung neu erstellt und die globalen Variablen, die ich gespeichert habe, gehen verloren.So speichern/wiederherstellen globale Variablen in Android, auch wenn os kill-Anwendung

Ich weiß nicht, wann diese Variablen zu speichern/wiederherstellen, Anwendung gibt uns einige Methoden wie onsaveinstancestate()/onrestoreinstancestate().

Ich habe eine Idee, aber ich kann nicht sicherstellen, dass es gut funktionieren kann. Ich sehe, dass einige app zu slashScreen gehen, wenn os es getötet, vielleicht können wir diese globalen Variablen in SplashAvtivity speichern? Da Activity über die Methoden onsaveinstancestate()/onrestoreinstancestate() verfügt, starten Sie zunächst splashActivity und beenden es nicht. Wenn wir os finden, können Sie die App beenden und dann zu splashActivity zurückkehren (alle Aktivitäten in Task beenden) und dann onestoreinstancestate().

Gibt es noch eine andere gute Möglichkeit, die globalen Variablen zu speichern/wiederherzustellen? Natürlich denke ich, wenn Google uns eine Methode wie onsaveinstancestate()/onrestoreinstancestate() in der Anwendung anbieten kann, wird es besser sein .:S

+1

gemeinsame Präferenzen verwenden – Raghunandan

+0

@Raghunandan ja, ich denke, Persistenz ist notwendig. Das Problem ist jedoch, wann die globalen Variablen gespeichert werden sollen. –

+0

betrachten Sie den Lebenszyklus der Aktivität und persistieren Wert, wo Sie wollen – Raghunandan

Antwort

8

Wenn eine Variable zwischen den Ausführungen bestehen bleiben muss, müssen Sie einige Datenträger tun Beharrlichkeit. Der einfachste Weg, wie von Raghunandan vorgeschlagen, ist Shared Preferences.

Um dies zu tun, erste Anforderung einer gemeinsam genutzten Vorlieben:

SharedPreferences prefs = getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); 
SharedPreferences.Editor editor = prefs.edit(); 
editor.putString("key_name", "key_value"); 
editor.commit(); //important, otherwise it wouldn't save. 

Sie dies tun können, zum Beispiel in der OnStop oder onPause der Aktivität (onPause wird immer dann aufgerufen, aber es gibt keine Garantie OnStop sein vor Honeycomb genannt).

In Ihrem onCreate (oder wenn Sie den Wert benötigen), lesen Sie von SharedPreferences und überprüfen, ob es einen Wert gesetzt ist, andernfalls einen Standardwert verwenden:

SharedPreferences prefs = getSharedPreferences(PREFS_NAME, 0); 
String myVariable = prefs.getString("key_name", "default_value"); 

Jetzt können Sie myVariable mit dem beibehaltenen Wert verwenden oder der Anfangswert (Standardwert), wenn zuvor noch nichts gespeichert wurde.

Weitere Informationen finden sich https://developer.android.com/guide/topics/data/data-storage.html#pref

Um zu klären, PREFS_NAME ist der Name Ihrer gemeinsamen Einstellungsdatei. Normalerweise müssen Sie den Paketnamen für Ihre Anwendung vorgeben, das ist eine gute Vorgehensweise.

+0

Vielen Dank Ihre Antwort. Es scheint, dass wir die Variablen auf Anwendungsebene nur auf Aktivitätsebene speichern/wiederherstellen können. –

+1

Sie können die Anwendung erweitern und dort einige Dinge tun, aber es gibt keine Möglichkeit, von der Anwendung selbst zu erfahren, dass sie getötet wird. Es gibt eine Möglichkeit, von einem anderen Prozess mit IBinder.linkToDeath() zu lernen und sich als DeathRecipient zu registrieren, aber das ist eine ganz andere Geschichte. Siehe diesen Link: http://www.androiddesignpatterns.com/2013/08/binders-death-recipients.html und https://developer.android.com/reference/android/os/IBinder.html –

0

Gemäß den neuen Richtlinien sollten Sie immer apply() anstelle von commit für gemeinsame Einstellungen verwenden. Während commit seine Daten sofort blockiert und in den persistenten Speicher schreibt, wird apply im Hintergrund verarbeitet und behindert nicht Ihre anderen laufenden Arbeiten.