Parcelable dan paket

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

Saat membuat objek Intent untuk digunakan di startActivity() dalam memulai Aktivitas baru, aplikasi dapat meneruskan parameter menggunakan metode putExtra().

Cuplikan kode berikut menunjukkan contoh cara melakukan operasi ini.

val intent = Intent(this, MyActivity::class.java).apply {
    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.

Terkadang, Anda mungkin perlu meneruskan objek kompleks di seluruh aktivitas atau mempertahankannya dalam status UI. Dalam hal ini, class kustom harus menerapkan Parcelable. Untuk aplikasi Kotlin dan Jetpack Compose modern, pendekatan yang direkomendasikan adalah menggunakan anotasi @Parcelize. Tindakan ini akan otomatis membuat logika serialisasi yang diperlukan untuk menangani data Anda dengan aman saat menggunakan Bundle. Ini adalah pendekatan yang sama yang digunakan untuk menangani data Anda saat menggunakan rememberSaveable. Untuk mengetahui informasi selengkapnya tentang penggunaan @Parcelize, lihat Pembuat implementasi 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, Anda harus memastikan bahwa versi class kustom yang sama persis ada di 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 Parcelable kustom 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 startActivity, rememberSaveable (yang menggunakan onSaveInstanceState di balik layar), dan interaksi apa pun dengan sistem. Jika batas ukuran terlampaui, TransactionTooLargeException akan ditampilkan.

Dalam kasus spesifik menyimpan status dengan rememberSaveable, 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 KB 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.