Objek Parcelable
dan Bundle
ditujukan untuk
digunakan di seluruh batas proses, seperti dengan transaksi IPC/Binder,
antara aktivitas dengan intent, dan untuk menyimpan status sementara 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 mengirimkannya melalui jaringan.
Mengirim data antar-aktivitas
Saat aplikasi membuat objek Intent
untuk digunakan di
startActivity(android.content.Intent)
dalam 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 akan membuat
aktivitas baru,
membatalkan pembagian data, dan meneruskan intent ke aktivitas baru.
Sebaiknya gunakan class Bundle
untuk menyetel primitif yang dikenal oleh OS pada
objek Intent
. Class Bundle
sangat
dioptimalkan untuk melakukan marshalling dan unmarshalling 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.
Aplikasi 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 mengetahui 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 Anda mengirim objek Parcelable
kustom dari satu aplikasi ke aplikasi lain, Anda harus memastikan bahwa versi class kustom yang sama persis ada pada aplikasi pengirim dan penerima. Biasanya ini berupa library umum
yang digunakan di kedua aplikasi. Error dapat terjadi jika aplikasi Anda mencoba mengirim parcelable kustom ke
sistem, karena sistem 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
untuk menambahkan
jumlah berulang. Modifikasi ini dapat mengakibatkan sistem menghapus Parcelable
kustom dari tambahan. Penghapusan ini, pada akhirnya, dapat menyebabkan aplikasi
error saat menerima intent alarm yang diubah, karena aplikasi mengharapkan
menerima data tambahan yang tidak ada lagi.
Buffering transaksi Binder memiliki ukuran tetap terbatas, saat ini sebesar 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. Jika batas ukuran terlampaui, TransactionTooLargeException akan ditampilkan.
Untuk kasus spesifik savedInstanceState, jumlah data harus dijaga agar tetap kecil karena proses sistem harus menyimpan data yang disediakan selama pengguna dapat menavigasi kembali ke aktivitas tersebut (meskipun jika proses aktivitas dimatikan). 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 runtime. Pada versi Android yang lebih rendah, sistem hanya menampilkan peringatan dalam logcat.