Кто-нибудь знает, где / когда вызывается этот метод Parcelable ?
@Override
public int describeContents() {
return 0;
}
Это должно быть преодолено. Но стоит ли делать с ним что-нибудь полезное?
Кто-нибудь знает, где / когда вызывается этот метод Parcelable ?
@Override
public int describeContents() {
return 0;
}
Это должно быть преодолено. Но стоит ли делать с ним что-нибудь полезное?
Ответы:
В
Parcelable
вызове определена константа,CONTENTS_FILE_DESCRIPTOR
которая предназначена для использованияdescribeContents()
для создания возвращаемого значения битовой маски.Описание
CONTENTS_FILE_DESCRIPTOR
в API ref :Что на самом деле означает: Если вам нужно поместить
FileDescriptor
объект в Parcelable вы должны / необходимо указать вCONTENTS_FILE_DESCRIPTOR
качестве возвращаемого значения describeContents (), то есть по « специальному объекту » (вdescribeContents()
описании iS) они на самом деле означают:FileDescriptor
.Вся эта функциональность Parcelable выглядит незавершенной (читай: имеет плохой дизайн). В документации есть еще одна странность:
Реализуете множественное наследование по правилам, определенным в удобочитаемой форме? :-)
Похоже, программист на C ++ спроектировал
Parceable
и в какой-то момент понял: черт возьми, в Java нет множественного наследования ... :-)источник
describeContents()
должен возвращать 0, когда «в нем нет ничего особенного» . Что на самом деле ничего не объясняет. Ваше объяснение намного яснее!CONTENTS_FILE_DESCRIPTOR
( на самом деле,hasFileDescriptors()
метод) , что я смог найти в исходном коде Android, чтобы броситьIllegalArgumentException
вActivityManagerService
с сообщением: «File дескрипторы передаются в Bundle / Намерение опции /» до «отказаться от возможных просочились дескрипторов файлов» . Насколько я понимаю, это из соображений безопасности (с использованием разрешения другого приложения). Поправьте меня если я ошибаюсь.Возможны только два значения: 0 или CONTENTS_FILE_DESCRIPTOR.
если вы сериализуете POLO, это значение всегда должно быть 0, CONTENTS_FILE_DESCRIPTOR зарезервирован для ParcelFileDescriptor , который может сериализовать файловый дескриптор (FD) в системе * unix.
источник
Из фреймворка Android единственное использование происходит в ActivityManagerService.java:
//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 (). И пакет будет выполнять итерацию всех данных в mMap (hashMap) или mParcelledData (Parcel). Мы разберемся с намерением. HasFileDescriptors () просто обертывает Parcel / Parcelable describeContents ().
Хотя, возможно, это единственное использование для describeContents (): оно используется для фильтрации FileDescriptor из Intent pass ...
источник