101

有谁知道在哪里/何时调用Parcelable的这种方法?

@Override
public int describeContents() {
    return 0;
}

它必须被覆盖。但是我应该考虑用它做一些有用的事情吗?

4

3 回答 3

189

Parcelable调用CONTENTS_FILE_DESCRIPTOR中定义了一个常量,用于describeContents()创建位掩码返回值。

API refCONTENTS_FILE_DESCRIPTOR中的描述为:

与 describeContents() 一起使用的位掩码:每个位表示一种在编组时被认为具有潜在特殊意义的对象。

这实际上意味着:如果您需要将FileDescriptor对象放入 Parcelable 您应该/必须指定CONTENTS_FILE_DESCRIPTOR为 describeContents() 的返回值,即通过“特殊对象”(在describeContents()的描述中)它们真正的意思是:FileDescriptor

整个Parcelable功能看起来还没有完成(阅读:设计不好)。文档中还有另一件奇怪的事情:

实现 Parcelable 接口的类还必须有一个名为 CREATOR 的静态字段,它是一个实现 Parcelable.Creator 接口的对象

通过以人类可读形式定义的规则实现多重继承?:-)

看起来像是 C++ 程序员设计Parceable的,并且在某些时候他意识到:哦,该死的,Java 中没有多重继承...... :-)

于 2011-02-06T17:09:11.167 回答
10

只有两个可能的值,0 或 CONTENTS_FILE_DESCRIPTOR

如果要序列化 ​​POLO,则该值应始终为 0,CONTENTS_FILE_DESCRIPTOR 是为ParcelFileDescriptor保留的,它可以在 *unix 系统中序列化文件描述符(FD)。

于 2017-08-31T06:28:12.870 回答
1

在 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) 中的所有数据。我们将弄清楚intent.hasFileDescriptors() 只是包装了Parcel/Parcelable describeContents()。

虽然,也许这是 describeContents() 的唯一用途:它用于从 Intent 传递中过滤 FileDescriptor ...

于 2020-11-03T09:43:42.867 回答