Parcelable, gdzie / kiedy użyto opisania treści ()?

94

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?

Cody
źródło
Wygląda na to, że nikt nie ma pomysłu ..? : - /
cody

Odpowiedzi:

183

W Parcelablewywołaniu zdefiniowano stałą, CONTENTS_FILE_DESCRIPTORktórej należy użyć describeContents()do utworzenia wartości zwracanej przez maskę bitową.

Opis CONTENTS_FILE_DESCRIPTORw 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ć FileDescriptorobiekt w Parcelable powinieneś / musi określać CONTENTS_FILE_DESCRIPTORjako 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ł Parceablei w pewnym momencie zdał sobie sprawę: O cholera, w Javie nie ma wielokrotnego dziedziczenia ... :-)

Ognyan
źródło
3
Dzięki za to szczegółowe wyjaśnienie. Znalazłem twoją odpowiedź po tym, jak byłem sfrustrowany tym samouczkiem , który twierdził, że 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!
WebViewer
1
@LeoLink android.os.ParcelFileDescriptor
Ognyan
7
Nie chodzi o wielokrotne dziedziczenie. Nie można zdefiniować metody statycznej w interfejsie Java, a nie w wersji używanej w systemie Android, stąd to pole CREATOR.
Aleks N.
1
@Ogre_BGR Nadal nie rozumiem. Może mógłbyś pokazać przykładowy kod, kiedy może się przydać?
programista Androida
3
@androiddeveloper Myślę, że nie jest przeznaczony do "normalnego" tworzenia aplikacji. Wygląda na to, że jest używany tylko w metodach natywnych do przekazywania informacji między procesami. Proszę spojrzeć na InputChannel.java (klasa opisująca komentarz) i android_os_Parcel.cpp
Ognyan
8

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.

Bowman Han
źródło
1

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 ...

allan
źródło