是否有人知道 Parcelable 的这种方法何时/何时被调用?
@Override
public int describeContents() {
return 0;
}
必须重写。但是,我应该考虑做一些有用的事情吗?
答案 0 :(得分:175)
Parcelable
中定义了一个名为CONTENTS_FILE_DESCRIPTOR
的常量,用于在describeContents()
中创建位掩码返回值。
API ref中CONTENTS_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 ...