Parcelable ve Bundle nesneleri, IPC/Binder işlemleri gibi süreç sınırlarında, amaç içeren etkinlikler arasında ve yapılandırma değişikliklerinde geçici durumu depolamak için kullanılmak üzere tasarlanmıştır. Bu sayfada, Parcelable ve Bundle nesnelerini kullanmayla ilgili öneriler ve en iyi uygulamalar yer almaktadır.
Not: Parcel, genel amaçlı bir serileştirme mekanizması değildir ve hiçbir zaman Parcel verisini diske depolamamanız veya ağ üzerinden göndermemeniz gerekir.
Etkinlikler arasında veri gönderme
Bir uygulama, yeni bir etkinlik başlatırken Intent içinde kullanılacak bir startActivity() nesnesi oluşturduğunda, uygulama putExtra() yöntemini kullanarak parametreleri iletebilir.
Aşağıdaki kod snippet'inde bu işlemin nasıl yapılacağına dair bir örnek gösterilmektedir.
val intent = Intent(this, MyActivity::class.java).apply { putExtra("media_id", "a1b2c3") // ... } startActivity(intent)
İşletim sistemi, amacın temel Bundle öğelerini ayırır. Ardından işletim sistemi yeni etkinliği oluşturur, verileri paketinden çıkarır ve amacı yeni etkinliğe iletir.
Bundle sınıfını kullanarak işletim sisteminde bilinen temel öğeleri Intent nesnelerinde ayarlamanızı öneririz. Bundle sınıfı, paketler kullanılarak sıralama ve sıralamayı kaldırma için son derece optimize edilmiştir.
Bazı durumlarda, etkinlikler arasında karmaşık nesneler geçirmeniz veya bunları kullanıcı arayüzü durumunda korumanız gerekebilir.
Bu gibi durumlarda, özel sınıf Parcelable'ı uygulamalıdır. Modern Kotlin ve Jetpack Compose
uygulamaları için önerilen yaklaşım, @Parcelize
ek açıklamasını kullanmaktır. Bu, Paketler kullanılırken verilerinizin güvenli bir şekilde işlenmesi için gereken serileştirme mantığını otomatik olarak oluşturur. Bu, rememberSaveable kullanılırken verilerinizi işlemek için kullanılan yaklaşımla aynıdır.
@Parcelize kullanımı hakkında daha fazla bilgi için Parcelable uygulama oluşturucu başlıklı makaleyi inceleyin.
Bir amaç aracılığıyla veri gönderirken veri boyutunu birkaç KB ile sınırlamaya dikkat etmelisiniz.
Çok fazla veri göndermek sistemin TransactionTooLargeException istisnası oluşturmasına neden olabilir.
Süreçler arasında veri gönderme
Süreçler arasında veri gönderme, etkinlikler arasında veri göndermeye benzer. Ancak işlemler arasında veri gönderirken özel paketlenebilirler kullanmamanızı öneririz. Bir uygulamadan diğerine özel Parcelable nesnesi gönderiyorsanız özel sınıfın tam olarak aynı sürümünün hem gönderen hem de alan uygulamada bulunduğundan emin olmanız gerekir. Bu genellikle her iki uygulamada da kullanılan ortak bir kitaplık olabilir. Uygulamanız sisteme özel bir paketlenebilir göndermeye çalışırsa hata oluşabilir. Bunun nedeni, sistemin hakkında bilgi sahibi olmadığı bir sınıfı ayrıştıramamasıdır.
Örneğin, bir uygulama AlarmManager sınıfını kullanarak alarm ayarlayabilir ve alarm amacında özel bir Parcelable kullanabilir. Alarm çaldığında sistem, tekrar sayısı eklemek için niyetin Bundle ekstralarını değiştirir. Bu değişiklik, sistemin ekstralardan özel Parcelable'yı kaldırmasına neden olabilir. Bu kaldırma işlemi, değiştirilmiş alarm intent'i aldığında uygulamanın kilitlenmesine neden olabilir. Bunun nedeni, uygulamanın artık mevcut olmayan ek veriler almayı beklemesidir.
Binder işlem arabelleği, sınırlı ve sabit bir boyuta (şu anda 1 MB) sahiptir. Bu boyut, işlem için devam eden tüm işlemler tarafından paylaşılır. Bu sınır, etkinlik başına değil işlem düzeyinde olduğundan bu işlemler, uygulamadaki tüm bağlayıcı işlemlerini (ör. startActivity, rememberSaveable (arka planda onSaveInstanceState kullanan) ve sistemle yapılan tüm etkileşimleri) içerir. Boyut sınırı aşıldığında TransactionTooLargeException istisnası oluşturulur.
rememberSaveable ile durumu kaydetme söz konusu olduğunda, sistem işlemi kullanıcının etkinliğe geri dönebileceği süre boyunca sağlanan verileri tutması gerektiğinden (etkinliğin işlemi sonlandırılmış olsa bile) veri miktarı küçük tutulmalıdır.
Kaydedilmiş durumu 50 KB'tan daha az veriyle sınırlamanızı öneririz.
Not: Android 7.0 (API düzeyi 24) ve sonraki sürümlerde sistem, çalışma zamanı istisnası olarak TransactionTooLargeException oluşturur.
Android'in daha eski sürümlerinde sistem yalnızca logcat'te bir uyarı gösterir.