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.