Parcelable dan paket

Objek Parcelable dan Bundle dimaksudkan untuk digunakan di seluruh batas proses seperti dengan IPC/Binder transaksi, antara aktivitas dengan intent, dan untuk menyimpan status sementara di seluruh konfigurasi perubahan. Halaman ini memberikan rekomendasi dan praktik terbaik untuk menggunakan Objek Parcelable dan Bundle.

Catatan: Parcel bukan serbaguna mekanisme serialisasi, 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 menggunakan parameter 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 pembagian data, dan meneruskan intent ke aktivitas baru.

Sebaiknya gunakan class Bundle untuk menetapkan komponen dasar yang dikenal oleh OS di Intent objek. Class Bundle memiliki dioptimalkan untuk marshalling dan unmarshalling menggunakan persil.

Biasanya, Anda mungkin memerlukan mekanisme untuk mengirimkan objek komposit atau kompleks di seluruh aktivitas. Dalam kasus semacam itu, kelas khusus harus mengimplementasikan Parcelable, dan memberikan metode Metode writeToParcel(android.os.Parcel, int). Elemen ini juga harus menyediakan kolom non-null yang disebut CREATOR yang mengimplementasikan antarmuka Parcelable.Creator, yang createFromParcel() 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 memunculkan Pengecualian TransactionTooLargeException.

Mengirim data antar-proses

Pengiriman data antar-proses mirip dengan pengiriman data antar-aktivitas. Namun, saat mengirim antar proses, kami menyarankan agar Anda tidak menggunakan parcelable kustom. Jika Anda mengirim Parcelable dari satu aplikasi ke aplikasi lainnya, Anda harus memastikan bahwa versi yang sama persis dari class kustom ada di aplikasi pengirim dan penerima. Biasanya ini bisa berupa library umum digunakan di kedua aplikasi. Error dapat terjadi jika aplikasi Anda mencoba mengirim parcelable kustom ke sistem, karena sistem tidak bisa melakukan unmarshal pada kelas yang tidak diketahuinya.

Misalnya, aplikasi mungkin menyetel alarm menggunakan class AlarmManager, dan menggunakan Parcelable kustom pada intent alarm. Bila alarm berbunyi, sistem akan memodifikasi atribut Bundle tambahan untuk ditambahkan dalam jumlah berulang. Modifikasi ini dapat mengakibatkan sistem menghapus Parcelable dari tambahan. Penghapusan ini, pada akhirnya, dapat mengakibatkan error saat menerima intent alarm yang dimodifikasi, karena aplikasi mengharapkan menerima data tambahan yang sudah tidak ada.

Buffering transaksi Binder memiliki ukuran tetap terbatas, saat ini sebesar 1 MB, yang digunakan bersama oleh semua transaksi yang sedang berlangsung. Karena batas ini sedang dalam proses, alih-alih pada tingkat per aktivitas, transaksi ini mencakup semua transaksi binder di aplikasi seperti onSaveInstanceState, startActivity, dan interaksi apa pun dengan sistem. Saat ukuran terlampaui, TransactionTooLargeException akan ditampilkan.

Untuk kasus tertentu savedInstanceState, jumlah data harus dijaga agar tetap kecil karena proses sistem perlu menyimpan data yang disediakan selama pengguna dapat menavigasi kembali ke aktivitas tersebut (bahkan 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 akan menampilkan TransactionTooLargeException sebagai pengecualian runtime. Pada versi Android yang lebih rendah, sistem hanya menampilkan peringatan dalam logcat.