Spätestens wenn zu einer App ein Einstellungsmenü hinzu kommen soll, muss man sich als App-Entwickler fragen, wie man überhaupt diese Einstellungen über einen App Neustart speichert. Im Folgenden werden die wichtigsten Arten der Speicherfunktionen in Apps genauer vorgestellt.

What you'll learn

Viele wichtige Komponenten der App haben teilweise eine eigene Art von Cache. So kann man z.B. in Eingabefelder Werte eintragen und nach einer Rotation des Gerätes bleibt das Eingabefeld befüllt.
Ebenso kann die Navigation Library sich behalten, welches Fragment gerade angezeigt werden soll.
Diese Art von Persistenz ist aber stets flüchtig und irgendwo im Arbeitsspeicher vermerkt. Bei einem Neustart der Anwendung, wird das wieder zurückgesetzt.

Die meisten Zwischenspeicher sind in einem serialisierbaren Block in der App zwischengespeichert und zu einem gewissen Zeitpunkt wieder abgeholt. Dass passiert entweder durch Objekte die als Serializable oder Parcelable gekenntzeichnet sind.
Views haben dazu meist Methoden in der die zu speichernde Daten meist in Bundles gespeichert (onSaveInstanceState) und wieder geladen (onRestoreInstanceState) werden.

Achtung: Die größe an Informationen, die man so zwischenspeichern kann ist Betriebbsystem-abhängig begrenzt. An sich kann man so z.B. in der Regel kein Bild oder einer Datei zwischenspeichern. Es bietet sich daher eher an, eine URL zu einem File zwischenzuspeichern.

Ähnlich funktioniert auch das Weitergeben von Daten in eine neue Activity. Hier wird ein Bundle an die neu zu startende Activity geschickt. Das ganze geschieht über Intents. Der Cache sorgt dann auch dafür dass, wenn das System die Activity neu Starten muss, das Bundle wiederhergestellt werden kann und keine Daten verloren gehen.

In Android kann mit ziemlich einfachen Methoden auf Shared Preferences zugegriffen werden, die als Key-Value Speicher dienen.

Achtung: Das ist dann in der Regel eine einfache Datei, die man mit Root-Zugriff im klartext auslesen kann.

Der Zugriff ist sehr schnell angelegt, beschränkt sich dann aber auch auf einfachere Datentypen. Listen sind oft nur mit Tricks persistierbar.
Shared Preferences sollten daher unkritische Daten enthalten wie App-Einstellungen. Deswegen bieten sich die Shared Preferences auch hervorragend für Settings an.

Preferences lassen sich speichern mit:

PreferenceManager.getDefaultSharedPreferences(this)
         .edit()
         .putBoolean("KEY", value)
         .apply()
         
// und laden mit:

val value = PreferenceManager.getDefaultSharedPreferences(this)
       .getBoolean("KEY", false)

Baue nun eine <Checkbox>. Nach einem Appstart soll diese ihren Zustand beibehalten, die der User ihr gibt.

Eine weitere Möglichkeit zu persistieren sind Dateien selbst in den Appspeicher zu speichern und zu laden. Das ist mit den Boardmitteln kein Problem, aber:

Für größere Datenmengen als Einstellungsmöglichkeiten und 1,2 Strings, bieten richtige Datenbanken. Diese lassen sich dann oft auch verschlüsseln und sind effizienter einzusetzen.

Hier gibt es eine Fülle an Libraries, die teilweise komplett verschiedene Datenbanktypen anbieten.
Z.b.

In der Regel wird man in einer App um die Nutzung von Shared Preferences nicht herum kommen. Sollten sonst noch Daten hinzukommen ist ObjectBox ein echter Tipp. Sobald die Datenmengen komplizierter und größer werden bietet sich Room an.