Tanımlanan içerikler () nerede / ne zaman parcelable kullanılır?


94

Bir Parcelable'ın bu yönteminin nerede / ne zaman çağrıldığını bilen var mı?

@Override
public int describeContents() {
    return 0;
}

Geçersiz kılınmalıdır. Ama onunla faydalı bir şey yapmayı düşünmeli miyim?


Görünüşe göre kimsenin bir fikri yok ..? : - /
cody

Yanıtlar:


183

Tanımlanan bir sabit vardır Parcelabledenir CONTENTS_FILE_DESCRIPTORkullanılacak kastedilmektedir describeContents()dönüş değeri bit maskesi oluşturmak için kullanılır.

Açıklama CONTENTS_FILE_DESCRIPTORiçinde API ref geçerli:

DefineContents () ile kullanım için bit maskeleri: her bit, sıraya dizildiğinde potansiyel özel önemi olduğu düşünülen bir tür nesneyi temsil eder.

Bunun anlamı FileDescriptorşudur: Nesneyi Parcelable'a koymanız gerekiyorsa, defineContents CONTENTS_FILE_DESCRIPTOR() 'in dönüş değeri olarak belirtmelisiniz / belirtmelisiniz , yani " özel nesne " ( describeContents()açıklamasında) ile bunlar gerçekten şu anlama gelir:FileDescriptor .

Bütün bu Parcelable işlevselliği bitmemiş görünüyor (okuyun: kötü bir tasarıma sahip). Belgelerde garip bir şey daha var:

Parcelable arabirimini uygulayan sınıflar, Parcelable arabirimini uygulayan bir nesne olan CREATOR adlı statik bir alana da sahip olmalıdır.

İnsan tarafından okunabilir biçimde tanımlanan kurallara göre çoklu kalıtım uygulamak mı? :-)

Görünüşe göre C ++ programcısı tasarladı Parceableve bir noktada fark etti: Kahretsin, Java'da çoklu miras yok ... :-)


3
Bu ayrıntılı açıklama için teşekkürler. Cevabınızı , "bu konuda özel bir şeyi olmadığında" 0 döndürmesi gerektiğini iddia eden bu eğitimden dolayı hayal kırıklığına uğradıktan sonra buldum . Bu gerçekten hiçbir şeyi açıklamıyor. Açıklamanız çok daha net! describeContents()
WebViewer

1
@LeoLink android.os.ParcelFileDescriptor
Ognyan

8
Bu çoklu mirasla ilgili değil. Android'de kullanılan sürümde değil, Java arayüzünde statik bir yöntem tanımlayamazsınız, dolayısıyla bu CREATOR alanı.
Aleks N.

3
@androiddeveloper "Normal" uygulama geliştirmede kullanılmaması gerektiğini düşünüyorum. İşlemler arasında bilgi aktarmak için yalnızca yerel yöntemler tarafından kullanılıyor gibi görünüyor. Lütfen InputChannel.java'ya (açıklamayı açıklayan sınıf) ve android_os_Parcel.cpp'ye
Ognyan

2
Sadece kullanım CONTENTS_FILE_DESCRIPTOR(aslında, hasFileDescriptors()ben Android kaynak kodunda bulmak mümkün olduğunu yöntemle), atma etmektir IllegalArgumentExceptioniçinde ActivityManagerService: bir mesajla "/ Niyet / seçenekleri Bundle geçirilen Dosya tanımlayıcılar" için "mümkün sızan dosya tanımlayıcıları reddetme" . Anladığım kadarıyla güvenlik nedeniyle (başka bir uygulamanın iznini kullanarak). Yanlışsam düzelt.
Slav

8

Yalnızca iki olası değer vardır, 0 veya CONTENTS_FILE_DESCRIPTOR

POLO'yu serileştiriyorsanız, bu değer her zaman 0 olmalıdır, CONTENTS_FILE_DESCRIPTOR, * unix sisteminde bir Dosya Tanımlayıcısını (FD) serileştirebilen ParcelFileDescriptor için ayrılmıştır .


1

Android çerçevesinden, tek kullanım ActivityManagerService.java'da gerçekleşir:

//ActivityManagerService.java
public int startActivityIntentSender(IApplicationThread caller,
    IntentSender intent, Intent fillInIntent, String resolvedType,
    IBinder resultTo, String resultWho, int requestCode,
    int flagsMask, int flagsValues) {
   // Refuse possible leaked file descriptors
   if (fillInIntent != null && fillInIntent.hasFileDescriptors()) {
       throw new IllegalArgumentException("File descriptors passed in Intent");
   }
   //...
}

Intent.java hasFileDescriptors () Bundle.java hasFileDescriptors () 'den gelir. Ve paket, mMap (hashMap) veya mParcelledData (Parcel) içindeki tüm verileri yineleyecektir. İntent.hasFileDescriptors () yalnızca Parcel / Parcelable defineContents () 'ı sarmalayacağını anlayacağız.

Belki de bu, defineContents () için tek kullanımdır: FileDescriptor'ı Intent pass'tan filtrelemek için kullanılır ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.