Parcelable dan paket

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.