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?
Yanıtlar:
Tanımlanan bir sabit vardır Parcelable
denir CONTENTS_FILE_DESCRIPTOR
kullanılacak kastedilmektedir describeContents()
dönüş değeri bit maskesi oluşturmak için kullanılır.
Açıklama CONTENTS_FILE_DESCRIPTOR
iç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ı Parceable
ve bir noktada fark etti: Kahretsin, Java'da çoklu miras yok ... :-)
describeContents()
CONTENTS_FILE_DESCRIPTOR
(aslında, hasFileDescriptors()
ben Android kaynak kodunda bulmak mümkün olduğunu yöntemle), atma etmektir IllegalArgumentException
iç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.
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 .
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 ...