Hier eine Zusammenstellung der gängigsten Möglichkeiten, um dies zu erreichen :
- Senden Sie Daten innerhalb der Absicht
- Statische Felder
- HashMap von
WeakReferences
- Objekte beibehalten (SQLite, Freigabeeinstellungen, Datei usw.)
TL; DR : Es gibt zwei Möglichkeiten, Daten gemeinsam zu nutzen: Daten in den Extras der Absicht übergeben oder an einem anderen Ort speichern. Wenn es sich bei Daten um Grundelemente, Zeichenfolgen oder benutzerdefinierte Objekte handelt: Senden Sie sie als Teil der Absichts-Extras (benutzerdefinierte Objekte müssen implementiert werden Parcelable
). Wenn Sie komplexe Objekte übergeben, speichern Sie eine Instanz in einem Singleton an einem anderen Ort und greifen Sie über die gestartete Aktivität darauf zu.
Einige Beispiele, wie und warum jeder Ansatz implementiert werden soll:
Senden Sie Daten innerhalb von Absichten
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("some_key", value);
intent.putExtra("some_other_key", "a value");
startActivity(intent);
Zur zweiten Aktivität:
Bundle bundle = getIntent().getExtras();
int value = bundle.getInt("some_key");
String value2 = bundle.getString("some_other_key");
Verwenden Sie diese Methode, wenn Sie primitive Daten oder Strings übergeben . Sie können auch Objekte übergeben, die implementiert werden Serializable
.
Obwohl verlockend, sollten Sie vor der Verwendung zweimal überlegen Serializable
: Es ist fehleranfällig und schrecklich langsam. Also generell: meideSerializable
wenn möglich. Wenn Sie komplexe benutzerdefinierte Objekte übergeben möchten, sehen Sie sich die Parcelable
Benutzeroberfläche an . Es ist schwieriger zu implementieren, hat aber im Vergleich zu erhebliche Geschwindigkeitsgewinne Serializable
.
Teilen Sie Daten, ohne auf der Festplatte zu bleiben
Es ist möglich, Daten zwischen Aktivitäten auszutauschen, indem sie im Speicher gespeichert werden, da in den meisten Fällen beide Aktivitäten im selben Prozess ausgeführt werden.
Hinweis: Manchmal, wenn der Benutzer Ihre Aktivität verlässt (ohne sie zu beenden), entscheidet sich Android möglicherweise dafür, Ihre Anwendung zu beenden. In einem solchen Szenario habe ich Fälle erlebt, in denen Android versucht, die letzte Aktivität mit der vor dem Beenden der App angegebenen Absicht zu starten. In diesem Fall gehen die in einem Singleton gespeicherten Daten (entweder Ihre oder Ihre Application
) verloren und es können schlimme Dinge passieren. Um solche Fälle zu vermeiden, behalten Sie entweder Objekte auf der Festplatte bei oder überprüfen Daten, bevor Sie sie verwenden, um sicherzustellen, dass sie gültig sind.
Verwenden Sie eine Singleton-Klasse
Haben Sie eine Klasse, um die Daten zu halten:
public class DataHolder {
private String data;
public String getData() {return data;}
public void setData(String data) {this.data = data;}
private static final DataHolder holder = new DataHolder();
public static DataHolder getInstance() {return holder;}
}
Aus der gestarteten Aktivität:
String data = DataHolder.getInstance().getData();
Verwenden Sie die Anwendung Singleton
Der Anwendungs-Singleton ist eine Instanz, android.app.Application
die beim Start der App erstellt wird. Sie können eine benutzerdefinierte bereitstellen, indem Sie Folgendes erweitern Application
:
import android.app.Application;
public class MyApplication extends Application {
private String data;
public String getData() {return data;}
public void setData(String data) {this.data = data;}
}
Vor dem Starten der Aktivität:
MyApplication app = (MyApplication) getApplicationContext();
app.setData(someData);
Dann aus der gestarteten Aktivität:
MyApplication app = (MyApplication) getApplicationContext();
String data = app.getData();
Statische Felder
Die Idee ist im Grunde die gleiche wie beim Singleton, aber in diesem Fall bieten Sie statischen Zugriff auf die Daten:
public class DataHolder {
private static String data;
public static String getData() {return data;}
public static void setData(String data) {DataHolder.data = data;}
}
Aus der gestarteten Aktivität:
String data = DataHolder.getData();
HashMap von WeakReferences
Dieselbe Idee, aber dem Garbage Collector erlauben, nicht referenzierte Objekte zu entfernen (z. B. wenn der Benutzer die Aktivität beendet):
public class DataHolder {
Map<String, WeakReference<Object>> data = new HashMap<String, WeakReference<Object>>();
void save(String id, Object object) {
data.put(id, new WeakReference<Object>(object));
}
Object retrieve(String id) {
WeakReference<Object> objectWeakReference = data.get(id);
return objectWeakReference.get();
}
}
Vor dem Starten der Aktivität:
DataHolder.getInstance().save(someId, someObject);
Aus der gestarteten Aktivität:
DataHolder.getInstance().retrieve(someId);
Möglicherweise müssen Sie die Objekt-ID mithilfe der Extras der Absicht übergeben oder nicht. Es hängt alles von Ihrem spezifischen Problem ab.
Objekte auf der Festplatte beibehalten
Die Idee ist, die Daten auf der Festplatte zu speichern, bevor die andere Aktivität gestartet wird.
Vorteile: Sie können die Aktivität von anderen Orten aus starten. Wenn die Daten bereits gespeichert sind, sollten sie einwandfrei funktionieren.
Nachteile: Die Implementierung ist umständlich und dauert länger. Benötigt mehr Code und damit mehr Chancen, Fehler einzuführen. Es wird auch viel langsamer sein.
Einige der Möglichkeiten, Objekte beizubehalten, umfassen: