Saya perlu memberikan referensi ke kelas yang melakukan sebagian besar pemrosesan saya melalui bundel.
Masalahnya adalah ini tidak ada hubungannya dengan maksud atau konteks dan memiliki sejumlah besar objek non-primitif. Bagaimana cara mengemas kelas menjadi parcelable / serializable dan meneruskannya ke startActivityForResult
?
Jawaban:
Mencari tahu jalan mana yang harus diambil membutuhkan jawaban tidak hanya pertanyaan kunci CommonsWare tentang "mengapa" tetapi juga pertanyaan "untuk apa?" apakah kamu melewatinya.
Kenyataannya adalah bahwa satu-satunya hal yang dapat melalui bundel adalah data biasa - yang lainnya didasarkan pada interpretasi dari apa arti atau maksud data itu. Anda tidak dapat benar-benar melewatkan suatu objek, tetapi yang dapat Anda lakukan adalah salah satu dari tiga hal:
1) Anda dapat memecah objek menjadi data penyusunnya, dan jika yang ada di ujung lain memiliki pengetahuan tentang objek yang sama, ia dapat mengumpulkan tiruan dari data serial. Begitulah cara sebagian besar tipe umum melewati bundel.
2) Anda bisa melewati pegangan buram. Jika Anda menyampaikannya dalam konteks yang sama (meskipun orang mungkin bertanya mengapa repot-repot) itu akan menjadi pegangan yang dapat Anda panggil atau dereferensi. Tetapi jika Anda meneruskannya melalui Binder ke konteks yang berbeda, nilai literalnya akan menjadi angka arbitrer (faktanya, angka arbitrer ini dihitung secara berurutan dari permulaan). Anda tidak dapat melakukan apa pun selain melacaknya, sampai Anda meneruskannya kembali ke konteks asli yang akan menyebabkan Binder mengubahnya kembali ke pegangan aslinya, membuatnya berguna lagi.
3) Anda dapat memberikan pegangan ajaib, seperti deskriptor file atau referensi ke objek os / platform tertentu, dan jika Anda menyetel bendera yang benar, Binder akan membuat klon yang menunjuk ke sumber daya yang sama untuk penerima, yang sebenarnya dapat digunakan di ujung lainnya. Tetapi ini hanya berfungsi untuk beberapa jenis objek.
Kemungkinan besar, Anda melewati kelas Anda hanya agar ujung yang lain dapat melacaknya dan memberikannya kembali kepada Anda nanti, atau Anda meneruskannya ke konteks di mana klon dapat dibuat dari data konstituen berseri ... atau yang lain Anda mencoba melakukan sesuatu yang tidak akan berhasil dan Anda perlu memikirkan kembali keseluruhan pendekatan.
sumber
Anda juga dapat menggunakan Gson untuk mengonversi objek menjadi JSONObject dan meneruskannya dalam paket. Bagi saya adalah cara paling elegan yang saya temukan untuk melakukan ini. Saya belum menguji bagaimana hal itu memengaruhi kinerja.
Dalam Aktivitas Awal
Dalam Aktivitas Berikutnya
sumber
The Parcelable antarmuka adalah cara yang baik untuk melewati sebuah objek dengan Intent.
Bagaimana cara membuat objek kustom saya menjadi Parcelable? adalah jawaban yang cukup bagus tentang cara menggunakan Parcelable
Google docs resmi juga menyertakan sebuah contoh
sumber
Anda bisa menggunakan status aplikasi global .
Memperbarui:
Sesuaikan lalu tambahkan ini ke AndroidManifest.xml Anda:
Dan kemudian buat kelas dalam proyek Anda seperti ini:
Dan karena " Ini dapat diakses melalui getApplication () dari Aktivitas atau Layanan apa pun ", Anda menggunakannya seperti ini:
Semoga membantu.
sumber
Anda juga dapat membuat objek Anda Serializable dan menggunakan Bundle ini getSerializable dan putSerializable metode.
sumber
Solusi yang mungkin:
Kelas CustomObject:
Objek subkustomisasi:
sumber
Satu cara lagi untuk mengirim objek melalui bundel adalah dengan menggunakan
bundle.putByteArray
kode Contoh
masukkan Object of DataBean ke Bundle:
Mengonversi objek menjadi array byte
Dapatkan kembali Objek dari Bundel:
Metode untuk mendapatkan objek dari array byte:
Semoga ini bisa membantu sobat lainnya.
sumber
1. Contoh yang sangat langsung dan mudah digunakan, buat objek yang akan dilewatkan mengimplementasikan Serializable.
2. melewati objek dalam bundel
3. dapatkan objek yang lewat dari bundel sebagai Serializable lalu transmisikan ke Object.
sumber
Ini adalah jawaban yang sangat terlambat untuk pertanyaan saya sendiri, tetapi terus mendapat perhatian, jadi saya merasa harus menjawabnya. Sebagian besar jawaban ini benar dan menangani pekerjaan dengan sempurna. Namun, itu tergantung dari kebutuhan aplikasinya. Jawaban ini akan digunakan untuk menjelaskan dua solusi untuk masalah ini.
Aplikasi
Yang pertama adalah Aplikasi , karena jawaban yang paling banyak dibicarakan di sini. Aplikasi adalah objek yang baik untuk menempatkan entitas yang membutuhkan referensi ke sebuah Konteks. Sebuah `ServerSocket` tidak diragukan lagi akan membutuhkan konteks (untuk file I / o atau update` ListAdapter` sederhana). Saya, secara pribadi, lebih suka rute ini. Saya suka aplikasi, mereka berguna untuk pengambilan konteks (karena mereka dapat dibuat statis dan tidak mungkin menyebabkan kebocoran memori) dan memiliki siklus hidup yang sederhana.Layanan
The Service` adalah yang kedua. Sebuah `Layanan` sebenarnya adalah pilihan yang lebih baik untuk masalah saya karena untuk itulah layanan dirancang untuk dilakukan: Layanan rapi karena memiliki siklus hidup yang lebih jelas yang lebih mudah dikendalikan. Lebih lanjut, jika diperlukan, layanan dapat dijalankan secara eksternal dari aplikasi (mis. Saat boot). Ini mungkin diperlukan untuk beberapa aplikasi atau hanya fitur yang rapi.Ini juga bukan deskripsi lengkap, tapi saya meninggalkan tautan ke dokumen bagi mereka yang ingin menyelidiki lebih lanjut. Secara keseluruhan
Service
lebih baik untuk contoh yang saya butuhkan - menjalankan ServerSocket ke perangkat SPP saya.sumber
Saya menemukan pertanyaan ini ketika saya sedang mencari cara untuk mengirimkan objek Tanggal. Dalam kasus saya, seperti yang disarankan di antara jawaban, saya menggunakan Bundle.putSerializable () tetapi itu tidak akan berfungsi untuk hal yang kompleks seperti yang dijelaskan DataManager di posting asli.
Saran saya yang akan memberikan hasil yang sangat mirip dengan meletakkan kata DataManager di Aplikasi atau membuatnya menjadi Singleton adalah dengan menggunakan Dependency Injection dan mengikat DataManager ke lingkup Singleton dan menyuntikkan DataManager di mana pun itu dibutuhkan. Anda tidak hanya mendapatkan keuntungan dari peningkatan kemampuan pengujian, tetapi Anda juga akan mendapatkan kode yang lebih bersih tanpa semua kode pelat boiler "meneruskan dependensi antara kelas dan aktivitas". (Robo) Guice sangat mudah digunakan dan kerangka kerja Dagger yang baru juga terlihat menjanjikan.
sumber
cara sederhana lain untuk mengirimkan objek menggunakan bundel:
sumber