有人知道在何时何处会调用这个Parcelable的方法吗?
@Override
public int describeContents() {
return 0;
}
这个方法必须被覆盖(overriden),但我是否应该考虑对其进行一些有用的操作呢?
有人知道在何时何处会调用这个Parcelable的方法吗?
@Override
public int describeContents() {
return 0;
}
这个方法必须被覆盖(overriden),但我是否应该考虑对其进行一些有用的操作呢?
Parcelable
中定义了一个常量CONTENTS_FILE_DESCRIPTOR
,意味着用于describeContents()
以创建位掩码返回值。CONTENTS_FILE_DESCRIPTOR
是:每个位表示被视为具有潜在特殊意义的对象种类的位掩码,这实际上意味着:如果需要将FileDescriptor
对象放入可包含的对象中,则应该/必须将CONTENTS_FILE_DESCRIPTOR
指定为describeContents()
的返回值。也就是说,“特殊对象”(在describeContents()
的说明中)实际上指的是:FileDescriptor
。Parcelable
功能看起来未完成(即:设计不良)。文档中还有另一件奇怪的事情:实现Parcelable接口的类还必须有一个名为CREATOR的静态字段,它是实现Parcelable.Creator接口的对象。Parceable
并在某个时候意识到:哦,该死,在Java中没有多重继承... :-)describeContents()
应该返回 0。但是这并没有解释任何问题。您的解释更加清晰易懂! - WebViewerCONTENTS_FILE_DESCRIPTOR
(实际上是hasFileDescriptors()
方法)唯一的用途是在ActivityManagerService
中抛出IllegalArgumentException
异常,并显示消息:“在Bundle/Intent/options中传递文件描述符”以“拒绝可能的泄漏文件描述符”。我的理解是出于安全原因(使用另一个应用程序的权限)。如果我理解有误,请纠正我。 - SlavCONTENT_FILE_DESCRIPTOR
的列表链接:http://androidxref.com/source/search?q=return+Parcelable.CONTENTS_FILE_DESCRIPTOR%3B&defs=&refs=&path=&hist=&project=abi&project=bionic&project=bootable&project=build&project=cts&project=dalvik&project=development&project=device&project=docs&project=external&project=frameworks&project=gdk&project=hardware&project=libcore&project=libnativehelper&project=ndk&project=packages&project=pdk&project=prebuilts&project=sdk&project=system&project=tools - Ognyan只有两种可能的值,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()方法。 而bundle将迭代mMap(hashMap)或mParcelledData(Parcel)中的所有数据。 我们可以发现intent.hasFileDescriptors()只是包装了Parcel/Parcelable的describeContents()方法。
然而,也许这是describeContents()方法唯一的用途: 它用于从Intent传递中过滤FileDescriptor...