Parsel dan Paket

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.

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.