parcelable在哪里/何时使用describeContents()?

时间:2010-11-02 10:53:01

标签: android parcelable parcel

是否有人知道 Parcelable 的这种方法何时/何时被调用?

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

必须重写。但是,我应该考虑做一些有用的事情吗?

3 个答案:

答案 0 :(得分:175)

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中没有多重继承......: - )

答案 1 :(得分:4)

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

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

答案 2 :(得分: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 ...