Berikut ini kompilasi cara paling umum untuk mencapai hal ini :
- Kirim data di dalam niat
- Bidang statis
- HashMap dari
WeakReferences
- Objek yang bertahan (sqlite, preferensi berbagi, file, dll.)
TL; DR : ada dua cara berbagi data: mengirimkan data dalam ekstra maksud atau menyimpannya di tempat lain. Jika data primitif, string atau objek yang ditentukan pengguna: kirim sebagai bagian dari maksud ekstra (objek yang ditentukan pengguna harus mengimplementasikan Parcelable
). Jika melewati objek yang kompleks, simpan instance dalam singleton di tempat lain dan akses mereka dari aktivitas yang diluncurkan.
Beberapa contoh bagaimana dan mengapa menerapkan setiap pendekatan:
Kirim data di dalam maksud
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("some_key", value);
intent.putExtra("some_other_key", "a value");
startActivity(intent);
Pada aktivitas kedua:
Bundle bundle = getIntent().getExtras();
int value = bundle.getInt("some_key");
String value2 = bundle.getString("some_other_key");
Gunakan metode ini jika Anda melewatkan data primitif atau String . Anda juga bisa melewatkan objek yang mengimplementasikan Serializable
.
Meskipun menggoda, Anda harus berpikir dua kali sebelum menggunakan Serializable
: itu rawan kesalahan dan sangat lambat. Jadi secara umum: menjauhlahSerializable
jika memungkinkan. Jika Anda ingin meneruskan objek rumit yang ditentukan pengguna, lihat Parcelable
antarmuka . Ini lebih sulit untuk diimplementasikan, tetapi memiliki kecepatan yang lebih baik dibandingkan dengan Serializable
.
Bagikan data tanpa tetap ke disk
Dimungkinkan untuk berbagi data antara aktivitas dengan menyimpannya dalam memori mengingat bahwa, dalam kebanyakan kasus, kedua aktivitas berjalan dalam proses yang sama.
Catatan: terkadang, ketika pengguna meninggalkan aktivitas Anda (tanpa berhenti), Android dapat memutuskan untuk membunuh aplikasi Anda. Dalam skenario seperti itu, saya pernah mengalami kasus di mana android mencoba untuk meluncurkan aktivitas terakhir menggunakan maksud yang disediakan sebelum aplikasi terbunuh. Dalam kasus ini, data disimpan dalam singleton (milik Anda atauApplication
) akan hilang dan hal-hal buruk dapat terjadi. Untuk menghindari kasus-kasus seperti itu, Anda bisa tetap objek ke disk atau memeriksa data sebelum menggunakannya untuk memastikan itu valid.
Gunakan kelas singleton
Memiliki kelas untuk menyimpan data:
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;}
}
Dari aktivitas yang diluncurkan:
String data = DataHolder.getInstance().getData();
Gunakan aplikasi singleton
Aplikasi singleton adalah sebuah instance android.app.Application
yang dibuat ketika aplikasi diluncurkan. Anda dapat memberikan yang khusus dengan memperluas 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;}
}
Sebelum meluncurkan aktivitas:
MyApplication app = (MyApplication) getApplicationContext();
app.setData(someData);
Kemudian, dari aktivitas yang diluncurkan:
MyApplication app = (MyApplication) getApplicationContext();
String data = app.getData();
Bidang statis
Idenya pada dasarnya sama dengan singleton, tetapi dalam hal ini Anda memberikan akses statis ke data:
public class DataHolder {
private static String data;
public static String getData() {return data;}
public static void setData(String data) {DataHolder.data = data;}
}
Dari aktivitas yang diluncurkan:
String data = DataHolder.getData();
HashMap dari WeakReferences
Gagasan yang sama, tetapi memungkinkan pengumpul sampah untuk menghapus objek yang tidak direferensikan (mis. Ketika pengguna berhenti dari aktivitas):
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();
}
}
Sebelum meluncurkan aktivitas:
DataHolder.getInstance().save(someId, someObject);
Dari aktivitas yang diluncurkan:
DataHolder.getInstance().retrieve(someId);
Anda mungkin atau mungkin tidak harus melewati id objek menggunakan ekstra maksud. Itu semua tergantung pada masalah spesifik Anda.
Terus objek ke disk
Idenya adalah untuk menyimpan data dalam disk sebelum meluncurkan aktivitas lainnya.
Keuntungan: Anda dapat meluncurkan aktivitas dari tempat lain dan, jika data sudah bertahan, itu akan berfungsi dengan baik.
Kerugian: rumit dan membutuhkan lebih banyak waktu untuk diterapkan. Membutuhkan lebih banyak kode dan dengan demikian lebih banyak kesempatan untuk memperkenalkan bug. Itu juga akan jauh lebih lambat.
Beberapa cara untuk bertahan objek termasuk: