有谁知道在哪里/何时调用Parcelable的这种方法?
@Override
public int describeContents() {
return 0;
}
它必须被覆盖。但是我应该考虑用它做一些有用的事情吗?
有谁知道在哪里/何时调用Parcelable的这种方法?
@Override
public int describeContents() {
return 0;
}
它必须被覆盖。但是我应该考虑用它做一些有用的事情吗?
在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 中没有多重继承...... :-)
只有两个可能的值,0 或 CONTENTS_FILE_DESCRIPTOR
如果要序列化 POLO,则该值应始终为 0,CONTENTS_FILE_DESCRIPTOR 是为ParcelFileDescriptor保留的,它可以在 *unix 系统中序列化文件描述符(FD)。
在 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 ...