Ayrıştırılabilir öğeler ve paketler

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.