Objek Parcelable
dan Bundle
ditujukan untuk digunakan di seluruh batas proses, misalnya pada transaksi IPC/Binder, antara aktivitas dengan intent, serta untuk menyimpan status transien di seluruh perubahan konfigurasi. Halaman ini memberikan rekomendasi dan praktik terbaik untuk menggunakan objek Parcelable
dan Bundle
.
Catatan: Parcel
bukan mekanisme serialisasi untuk tujuan umum, dan Anda tidak boleh menyimpan data Parcel
apa pun di disk atau mengirimnya melalui jaringan.
Mengirim data antar-aktivitas
Jika aplikasi membuat objek Intent
untuk digunakan di startActivity(android.content.Intent)
saat memulai Aktivitas baru, aplikasi dapat meneruskan parameter menggunakan metode putExtra(java.lang.String, java.lang.String)
.
Cuplikan kode berikut menunjukkan contoh cara melakukan operasi ini.
Kotlin
val intent = Intent(this, MyActivity::class.java).apply { putExtra("media_id", "a1b2c3") // ... } startActivity(intent)
Java
Intent intent = new Intent(this, MyActivity.class); intent.putExtra("media_id", "a1b2c3"); // ... startActivity(intent);
OS tersebut membuat parsel Bundle
intent yang mendasarinya. Kemudian, OS membuat aktivitas baru, membatalkan parsel data, dan meneruskan intent ke aktivitas baru.
Sebaiknya gunakan class Bundle
untuk menyetel elemen dasar yang dikenal oleh OS pada objek Intent
. Class Bundle
sangat dioptimalkan untuk melakukan marshall dan unmarshall menggunakan parsel.
Biasanya, Anda mungkin memerlukan mekanisme untuk mengirimkan objek komposit atau kompleks di seluruh aktivitas.
Dalam hal ini, class kustom harus menerapkan Parcelable, dan memberikan metode writeToParcel(android.os.Parcel, int)
yang sesuai.
URL juga harus menyediakan kolom non-null bernama CREATOR
yang mengimplementasikan antarmuka Parcelable.Creator
, yang metode createFromParcel()
-nya digunakan untuk mengonversi Parcel
kembali ke objek saat ini.
Untuk informasi selengkapnya, lihat dokumentasi referensi untuk objek Parcelable
.
Saat mengirim data melalui intent, Anda harus berhati-hati untuk membatasi ukuran data menjadi beberapa KB.
Mengirim terlalu banyak data dapat menyebabkan sistem menampilkan pengecualian TransactionTooLargeException
.
Mengirim data antar-proses
Pengiriman data antar-proses mirip dengan pengiriman data antar-aktivitas. Namun, saat mengirim antar-proses, sebaiknya Anda tidak menggunakan parcelable kustom. Jika mengirim objek Parcelable
kustom dari satu aplikasi ke aplikasi lain, pastikan versi yang sama persis dengan class kustom ada pada aplikasi pengirim dan penerima. Biasanya hal ini dapat berupa library umum yang digunakan di kedua aplikasi. Error dapat terjadi jika aplikasi Anda mencoba mengirimkan parcelable kustom ke sistem, karena sistem tersebut tidak dapat melakukan unmarshal class yang tidak diketahuinya.
Misalnya, aplikasi mungkin menyetel alarm menggunakan class AlarmManager
, dan menggunakan Parcelable
kustom pada intent alarm. Saat alarm berbunyi, sistem akan mengubah Bundle
tambahan intent tersebut untuk menambahkan hitungan berulang. Modifikasi ini dapat mengakibatkan sistem melakukan stripping setelan kustom Parcelable
dari tambahan. Stripping ini, pada gilirannya, dapat mengakibatkan error aplikasi saat menerima intent alarm yang diubah, karena aplikasi berharap akan menerima data tambahan yang tidak lagi ada di sana.
Buffering transaksi Binder memiliki ukuran tetap terbatas, saat ini 1 MB, yang digunakan bersama oleh semua transaksi yang sedang berlangsung untuk proses tersebut. Karena batas ini berada pada tingkat proses, bukan pada tingkat per aktivitas, transaksi ini mencakup semua transaksi binder di aplikasi seperti onSaveInstanceState, startActivity, dan interaksi apa pun dengan sistem. Setelah batas ukuran terlampaui, TransactionTooLargeException akan ditampilkan.
Dalam kasus spesifik savedInstanceState, jumlah data harus diupayakan kecil karena proses sistem harus mempertahankan data yang diberikan selama pengguna dapat kembali ke aktivitas tersebut (meskipun proses aktivitas tersebut diakhiri). Sebaiknya pertahankan status tersimpan agar tidak melebihi 50 ribu data.
Catatan: Di Android 7.0 (API level 24) dan yang lebih tinggi, sistem menampilkan TransactionTooLargeException sebagai pengecualian saat runtime. Pada versi Android yang lebih rendah, sistem hanya menampilkan peringatan dalam logcat.