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

cod*_*ody 91 android parcel parcelable

有谁知道调用Parcelable的这种方法的位置/时间?

@Override
public int describeContents() {
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

Ogn*_*yan 179

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

API参考CONTENTS_FILE_DESCRIPTOR中的描述是:

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

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

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

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

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

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

  • 这不是关于多重继承.您无法在Java界面中定义静态方法,也不能在Android中使用的版本中定义静态方法,因此这个CREATOR字段. (6认同)
  • 感谢您的详细说明。在受到[本教程]的挫败之后,我找到了您的答案(http://www.app-solut.com/blog/2011/05/using-self-defined-parcelable-objects-during-an-android-aidl-rpc -ipc-call /)声称,只要'describeContents()'*“没有什么特别之处” *,它就应返回0。哪个并没有真正解释什么。您的解释非常清楚! (2认同)
  • @androiddeveloper我认为在"普通"应用程序开发中使用它并不是很好.它似乎只用于本机方法,以便在进程之间传递信息.请查看[InputChannel.java](http://androidxref.com/source/xref/frameworks/base/core/java/android/view/InputChannel.java)(描述评论的类)和[android_os_Parcel.cpp] (http://androidxref.com/4.2_r1/xref/frameworks/base/core/jni/android_os_Parcel.cpp#560) (2认同)
  • 我能够在 Android 源代码中找到的 `CONTENTS_FILE_DESCRIPTOR`(实际上是 `hasFileDescriptors()` 方法)的唯一用法是在 `ActivityManagerService` 中抛出 `IllegalArgumentException` 并带有一条消息:_"File descriptors connected in Bundle/意图/选项“_ 到 _”拒绝可能泄露的文件描述符“_。我的理解是出于安全原因(使用另一个应用程序的许可)。如果我错了纠正我。 (2认同)

bow*_*han 10

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

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