Кто-нибудь знает, где / когда вызывается этот метод Parcelable ?
@Override
public int describeContents() {
return 0;
}
Это должно быть преодолено. Но стоит ли делать с ним что-нибудь полезное?
Ответы:
В Parcelable
вызове определена константа, CONTENTS_FILE_DESCRIPTOR
которая предназначена для использования describeContents()
для создания возвращаемого значения битовой маски.
Описание CONTENTS_FILE_DESCRIPTOR
в API ref :
Битовые маски для использования с описаниемContents (): каждый бит представляет собой объект, который считается потенциально важным при упорядочивании.
Что на самом деле означает: Если вам нужно поместить FileDescriptor
объект в Parcelable вы должны / необходимо указать в CONTENTS_FILE_DESCRIPTOR
качестве возвращаемого значения describeContents (), то есть по « специальному объекту » (в describeContents()
описании iS) они на самом деле означают: FileDescriptor
.
Вся эта функциональность Parcelable выглядит незавершенной (читай: имеет плохой дизайн). В документации есть еще одна странность:
Классы, реализующие интерфейс Parcelable, также должны иметь статическое поле CREATOR, которое является объектом, реализующим интерфейс Parcelable.Creator.
Реализуете множественное наследование по правилам, определенным в удобочитаемой форме? :-)
Похоже, программист на 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 ...