Saya memiliki satu aktivitas yang merupakan aktivitas utama yang digunakan di seluruh aplikasi dan memiliki sejumlah variabel. Saya memiliki dua kegiatan lain yang ingin saya dapat menggunakan data dari kegiatan pertama. Sekarang saya tahu saya bisa melakukan sesuatu seperti ini:
GlobalState gs = (GlobalState) getApplication();
String s = gs.getTestMe();
Namun saya ingin berbagi banyak variabel dan beberapa mungkin agak besar sehingga saya tidak ingin membuat salinannya seperti di atas.
Apakah ada cara untuk langsung mendapatkan dan mengubah variabel tanpa menggunakan metode get and set? Saya ingat pernah membaca sebuah artikel di situs dev Google yang mengatakan ini tidak direkomendasikan untuk kinerja di Android.
Jawaban:
Berikut ini kompilasi cara paling umum untuk mencapai hal ini :
WeakReferences
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
Pada aktivitas kedua:
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, lihatParcelable
antarmuka . Ini lebih sulit untuk diimplementasikan, tetapi memiliki kecepatan yang lebih baik dibandingkan denganSerializable
.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 atau
Application
) 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:
Dari aktivitas yang diluncurkan:
Gunakan aplikasi singleton
Aplikasi singleton adalah sebuah instance
android.app.Application
yang dibuat ketika aplikasi diluncurkan. Anda dapat memberikan yang khusus dengan memperluasApplication
:Sebelum meluncurkan aktivitas:
Kemudian, dari aktivitas yang diluncurkan:
Bidang statis
Idenya pada dasarnya sama dengan singleton, tetapi dalam hal ini Anda memberikan akses statis ke data:
Dari aktivitas yang diluncurkan:
HashMap dari
WeakReferences
Gagasan yang sama, tetapi memungkinkan pengumpul sampah untuk menghapus objek yang tidak direferensikan (mis. Ketika pengguna berhenti dari aktivitas):
Sebelum meluncurkan aktivitas:
Dari aktivitas yang diluncurkan:
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:
sumber
setResult
metode. Juga, dalam hal ini, aktivitas sekunder harus dipanggil menggunakanstartActivityForResult
metode.Activity
seluruh, dan dalamonCreate()
memeriksa setiap bidang statis dari singleton yang Anda isi saat memulai aplikasi. Jika bidang itu kosong, kembali ke aktivitas mulai menggunakanFLAG_ACTIVITY_CLEAR_TASK
atauBroadcastReceiver
untuk menghentikan aktivitas lainnya.Apa yang dapat Anda gunakan:
Apa yang Anda pilih tergantung pada kebutuhan Anda. Mungkin Anda akan menggunakan lebih dari satu cara ketika Anda memiliki "banyak"
sumber
MAIN
tindakan. Setelah proses kematian, Anda memulai kembali aktivitas apa pun yang dibuka terakhir, yang bisa menjadi halaman detail di suatu tempat jauh di dalam aplikasi.Lakukan apa yang diperintahkan google untuk Anda lakukan! di sini: http://developer.android.com/resources/faq/framework.html#3
sumber
Itu tidak membuat salinan (terutama dengan String , tetapi bahkan objek dilewatkan oleh nilai referensi, bukan objek itu sendiri, dan pengambil seperti itu baik untuk digunakan - bisa dibilang lebih baik untuk digunakan daripada cara lain karena mereka umum dan dimengerti). "Mitos kinerja" yang lebih lama, seperti tidak menggunakan getter dan setter, masih memiliki beberapa nilai, tetapi juga telah diperbarui dalam dokumen .
Tetapi jika Anda tidak ingin melakukan itu, Anda juga bisa membuat variabel publik atau dilindungi di GlobalState dan mengaksesnya secara langsung. Dan, Anda dapat membuat singleton statis sebagai objek Aplikasi JavaDoc menunjukkan :
Menggunakan data Intent , sebagai jawaban lain di sini perhatikan adalah cara lain untuk meneruskan data, tetapi biasanya digunakan untuk data yang lebih kecil dan tipe sederhana. Anda dapat melewatkan data yang lebih besar / lebih kompleks, tetapi lebih terlibat daripada hanya menggunakan satu statis. The Aplikasi objek masih favorit pribadi saya untuk berbagi / data persisten non lebih kompleks yang lebih besar antara komponen aplikasi Android meskipun (karena memiliki siklus hidup didefinisikan dengan baik dalam sebuah aplikasi Android).
Juga, seperti yang telah dicatat oleh orang lain, jika data menjadi sangat kompleks dan harus gigih maka Anda dapat menggunakan SQLite atau sistem file juga.
sumber
Anda dapat memperluas kelas Aplikasi dan memberi tag pada objek apa pun yang Anda inginkan di sana, mereka kemudian tersedia di mana saja di aplikasi Anda
sumber
Ada cara baru dan lebih baik untuk berbagi data antar kegiatan, dan itu adalah LiveData . Perhatikan kutipan ini dari halaman pengembang Android:
Implikasinya sangat besar - data model apa pun dapat dibagi dalam kelas tunggal umum di dalam
LiveData
pembungkus. Itu dapat disuntikkan dari kegiatan ke masing-masingViewModel
demi testability. Dan Anda tidak perlu lagi khawatir dengan referensi yang lemah untuk mencegah kebocoran memori.sumber
Menggunakan hashmap dari pendekatan referensi lemah, yang dijelaskan di atas, dan di http://developer.android.com/guide/faq/framework.html tampaknya bermasalah bagi saya. Bagaimana seluruh entri direklamasi, bukan hanya nilai peta? Dalam cakupan apa Anda mengalokasikannya? Karena kerangka kerja mengendalikan siklus hidup Kegiatan, memiliki salah satu Kegiatan yang berpartisipasi memiliki risiko kesalahan runtime ketika pemilik dihancurkan sebelum klien-kliennya. Jika Aplikasi memilikinya, beberapa Kegiatan harus menghapus entri secara eksplisit untuk menghindari hashmap dari berpegang pada entri dengan kunci yang valid dan referensi lemah yang berpotensi dikumpulkan terkumpul. Lebih jauh, apa yang harus dilakukan klien ketika nilai yang dikembalikan untuk kunci adalah nol?
Bagi saya, WeakHashMap yang dimiliki oleh Aplikasi atau dalam singleton adalah pilihan yang lebih baik. Nilai dalam peta diakses melalui objek kunci, dan ketika tidak ada referensi kuat ke kunci (yaitu semua Kegiatan dilakukan dengan kunci dan apa peta itu), GC dapat mengklaim kembali entri peta.
sumber
Ada berbagai cara untuk berbagi data antar kegiatan
1: Mengirim data antar aktivitas menggunakan Intent
2: Menggunakan kata kunci statis, tentukan variabel sebagai statis publik dan gunakan di mana saja dalam proyek
gunakan di mana saja dalam proyek menggunakan classname.variableName;
3: Menggunakan Database
tetapi prosesnya agak panjang, Anda harus menggunakan kueri untuk memasukkan data dan mengulangi data menggunakan kursor saat dibutuhkan. Tetapi tidak ada kemungkinan kehilangan data tanpa membersihkan cache.
4: Menggunakan Preferensi yang dibagikan
jauh lebih mudah daripada database. tetapi ada beberapa batasan Anda tidak dapat menyimpan ArrayList, Daftar dan objek custome.
5: Buat pengambil getter di kelas Aplikasi dan akses di mana saja dalam proyek.
di sini diatur dan dapatkan dari kegiatan
sumber
Ya saya punya beberapa ide, tetapi saya tidak tahu apakah itu yang Anda cari.
Anda bisa menggunakan layanan yang menyimpan semua data dan kemudian hanya mengikat aktivitas Anda ke layanan untuk pengambilan data.
Atau kemas data Anda menjadi serial atau parcelable dan tempelkan ke bundel dan berikan bundel di antara aktivitas.
Yang ini mungkin sama sekali bukan yang Anda cari, tetapi Anda juga bisa mencoba menggunakan SharedPreferences atau preferensi secara umum.
Bagaimanapun, beri tahu saya apa yang Anda putuskan.
sumber
Dengan asumsi Anda memanggil aktivitas dua dari aktivitas satu menggunakan Intent.
Anda dapat mengirimkan data dengan intent.putExtra (),
Ambil ini untuk referensi Anda. Mengirim array dengan Intent.putExtra
Semoga itu yang Anda inginkan.
sumber
Jika niat Anda adalah untuk memanggil Aktivitas lain dari Aktivitas saat ini, Anda harus menggunakan Maksud . Fokus Anda bisa lebih sedikit pada data yang bertahan daripada membagikannya sesuai kebutuhan.
Namun, jika Anda benar-benar perlu mempertahankan nilai-nilai ini maka Anda bisa bertahan dalam beberapa jenis file teks terstruktur atau database pada penyimpanan lokal. File properti, file XML, atau file JSON dapat menyimpan data Anda dan mudah diurai selama pembuatan aktivitas. Jangan lupa juga bahwa Anda memiliki SQLite di semua perangkat Android, sehingga Anda bisa menyimpannya dalam tabel database. Anda juga bisa menggunakan Peta untuk menyimpan pasangan nilai kunci dan membuat serial peta untuk penyimpanan lokal, tetapi ini mungkin terlalu rumit untuk berguna bagi struktur data sederhana.
sumber
Semua jawaban yang disebutkan di atas sangat bagus ... Saya hanya menambahkan satu yang belum ada yang menyebutkan tentang tetap menggunakan data melalui aktivitas dan itu adalah menggunakan database SQLite android bawaan untuk mempertahankan data yang relevan ... Bahkan Anda dapat menempatkan databaseBantuan dalam status aplikasi dan panggil sesuai kebutuhan di seluruh aktivasi .. Atau buat kelas pembantu dan buat panggilan DB bila diperlukan ... Cukup tambahkan lapisan lain untuk Anda pertimbangkan ... Tapi semua jawaban lain sudah cukup juga .. Benar-benar hanya preferensi
sumber
Berbagi data antara aktivitas misalnya mengirim email setelah login
"email" adalah nama yang dapat digunakan untuk merujuk nilai pada aktivitas yang diminta
1 Kode pada halaman login
2 kode di halaman beranda
sumber
Dan jika Anda ingin bekerja dengan objek data, dua alat ini sangat penting:
Serializable vs Parcelable
public class User implements Parcelable
periksa lebih lanjut di sini
sumber