Czy ktoś wie, gdzie / kiedy wywoływana jest ta metoda Parcelable ?
@Override
public int describeContents() {
return 0;
}
Musi zostać zastąpiony. Ale czy powinienem rozważyć zrobienie z nim czegoś użytecznego?
Odpowiedzi:
W Parcelable
wywołaniu zdefiniowano stałą, CONTENTS_FILE_DESCRIPTOR
której należy użyć describeContents()
do utworzenia wartości zwracanej przez maskę bitową.
Opis CONTENTS_FILE_DESCRIPTOR
w referencji API to:
Maski bitowe do użytku w połączeniu z descriptionContents (): każdy bit reprezentuje rodzaj obiektu uważanego za mający potencjalnie specjalne znaczenie, gdy jest uporządkowany.
Co naprawdę oznacza: Jeśli trzeba umieścić FileDescriptor
obiekt w Parcelable powinieneś / musi określać CONTENTS_FILE_DESCRIPTOR
jako wartości zwracanej describeContents (), czyli o „ szczególnym obiektem ” (w describeContents()
„s opis) tak naprawdę chodziło FileDescriptor
.
Ta cała funkcjonalność Parcelable wygląda na niedokończoną (czytaj: ma zły projekt). W dokumentach jest jeszcze jedna dziwna rzecz:
Klasy implementujące interfejs Parcelable muszą mieć również pole statyczne o nazwie CREATOR, które jest obiektem implementującym interfejs Parcelable.
Wdrażasz wielokrotne dziedziczenie przez reguły zdefiniowane w formie czytelnej dla człowieka? :-)
Wygląda na to, że programista C ++ zaprojektował Parceable
i w pewnym momencie zdał sobie sprawę: O cholera, w Javie nie ma wielokrotnego dziedziczenia ... :-)
describeContents()
powinien zwrócić 0, gdy „nie ma w tym nic specjalnego” . Co tak naprawdę niczego nie wyjaśnia. Twoje wyjaśnienie jest o wiele jaśniejsze!
Są tylko dwie możliwe wartości, 0 lub CONTENTS_FILE_DESCRIPTOR
jeśli serializujesz POLO, ta wartość powinna zawsze wynosić 0, CONTENTS_FILE_DESCRIPTOR jest zarezerwowana dla ParcelFileDescriptor , który może serializować deskryptor pliku (FD) w systemie * unix.
Z platformy Android,
//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 () pochodzi z Bundle.java hasFileDescriptors (). Pakiet będzie iterował wszystkie dane w mMap lub mParcelledData. Dowiemy się, jak używać funkcji descriptionContents ().
Chociaż, być może jest to jedyne użycie opisania treści do filtrowania FileDescriptor z przejścia intencji ...