Parcelable
ve Bundle
nesnelerinin IPC/Binder işlemleri gibi işlem sınırlarında, amaca sahip etkinlikler arasında ve yapılandırma değişiklikleri genelinde geçici durumu depolamak için kullanılması amaçlanmıştır. Bu sayfada, Parcelable
ve Bundle
nesnelerini kullanmayla ilgili öneriler ve en iyi uygulamalar sunulmaktadır.
Not: Parcel
genel amaçlı bir serileştirme mekanizması değildir ve hiçbir Parcel
verisini diskte depolamamanız ya da ağ üzerinden göndermemeniz gerekir.
Etkinlikler arasında veri gönderme
Bir uygulama, yeni bir etkinlik başlatırken startActivity(android.content.Intent)
içinde kullanmak üzere bir Intent
nesnesi oluşturduğunda, uygulama putExtra(java.lang.String, java.lang.String)
yöntemini kullanarak parametreleri aktarabilir.
Aşağıdaki kod snippet'inde, bu işlemin nasıl gerçekleştirileceğine dair bir örnek gösterilmektedir.
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, amacın temel Bundle
öğesini paketler. Daha sonra, işletim sistemi yeni etkinliği oluşturur, verileri ayrıştırır ve niyeti yeni etkinliğe iletir.
Intent
nesnelerinde işletim sistemi tarafından bilinen temel öğeleri ayarlamak için Bundle
sınıfını kullanmanızı öneririz. Bundle
sınıfı, paket kullanarak sıralama ve tasfiye etme işlemleri için yüksek düzeyde optimize edilmiştir.
Bazı durumlarda, etkinlikler arasında bileşik veya karmaşık nesneler göndermek için bir mekanizmaya ihtiyacınız olabilir.
Bu gibi durumlarda, özel sınıf Parcelable'ı uygulamalı ve uygun writeToParcel(android.os.Parcel, int)
yöntemini sağlamalıdır.
Ayrıca Parcelable.Creator
arayüzünü uygulayan CREATOR
adlı boş olmayan bir alan sağlamalıdır. Bu alan Parcel
öğesini tekrar geçerli nesneye dönüştürmek için kullanılan createFromParcel()
yöntemidir.
Daha fazla bilgi için Parcelable
nesnesinin referans belgelerine bakın.
Amaçla veri gönderirken veri boyutunu birkaç KB ile sınırlamaya dikkat etmelisiniz.
Çok fazla veri göndermek, sistemin bir TransactionTooLargeException
istisnası uygulamasına neden olabilir.
İşlemler arasında veri gönderme
Süreçler arasında veri göndermek, etkinlikler arasında veri göndermeye benzer. Ancak, işlemler arasında gönderim yaparken özel paketlenebilir öğeler kullanmamanızı öneririz. Bir uygulamadan diğerine özel Parcelable
nesnesi gönderirseniz özel sınıfın tam olarak aynı sürümünün hem gönderen hem de alıcı uygulamada kullanıldığından emin olmanız gerekir. Genellikle bu, her iki uygulamada da
kullanılan ortak bir kitaplık olabilir. Uygulamanız sisteme özel paket göndermeye çalışırsa bir hata oluşabilir çünkü sistem, hakkında bilgi sahibi olmadığı bir sınıfı boşa çıkaramaz.
Örneğin, bir uygulama AlarmManager
sınıfını kullanarak alarm kurabilir ve alarm amacında özel bir Parcelable
kullanabilir. Alarm çaldığında sistem, tekrarlama sayısı eklemek için amacın ekstra Bundle
değerini değiştirir. Bu değişiklik, sistemin özel Parcelable
öğesini ekstralardan çıkarmasına neden olabilir. Sonuç olarak, uygulama, değiştirilmiş alarm amacını aldığında artık orada olmayan fazladan verileri almayı beklediği için bu çıkarma işlemi de uygulamanın kilitlenmesine neden olabilir.
Bağlayıcı işlem arabelleği sınırlı bir sabit boyuta sahiptir (şu anda 1 MB). Bu boyut, süreç 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 onSaveInstanceState, startActivity gibi tüm bağlayıcı işlemleri ve sistemle olan tüm etkileşimleri içerir. Boyut sınırı aşıldığında bir TransactionTooLargeException yayınlanır.
SaveInstanceState durumundaki özel durumda, veri miktarı az tutulmalıdır. Çünkü sistem işleminin, sağlanan verileri kullanıcı söz konusu etkinliğe dönebildiği sürece (etkinliğin işlemi sonlandırılsa bile) elde tutması gerekir. Kaydedilen durumu, 50.000 verinin altında tutmanızı öneririz.
Not: Android 7.0 (API düzeyi 24) ve sonraki sürümlerde sistem, çalışma zamanı istisnası olarak bir TransactionTooLargeException hatası verir. Android'in daha düşük sürümlerinde sistem yalnızca logcat'te bir uyarı gösterir.