1

我不是在问我如何使用它,也不是在问它是做什么的,它是如何工作的。当我想到他们为什么不放一个putExtra(String,Object)这样我就可以传递一个对象时,这个问题就来了。显然他们只是没有忘记这样做,而不是 Bundle 的工作方式不是你可以做到的。

PS:Serializable或者Parcelable是您无法在您创建的每个类上实现的东西,因此它们不能替代putExtra(String,Object)

4

4 回答 4

3

显然他们只是没有忘记这样做

正确的。

正如 Doctoror Drive 所指出的,ABundle本身就是。Parcelablea 背后的要点Parcelable是能够将其放入 aParcel中,而 a 背后的要点Parcel是跨进程边界传递数据。您不能跨进程边界传递任意对象,就像您不能将任意对象写入文件并且不能通过套接字传输任意对象一样。

于 2014-05-30T12:27:02.733 回答
1

基本上,可打包可序列化的类在通用二进制文件中使用您的包引用进行“转换”。这使您能够通过数据库传输和持久化数据Intents等。

这背后的想法是保持某些状态ActivityFragment例如作为状态机。

默认情况下,系统使用 Bundle 实例状态来保存有关您的活动布局中每个 View 对象的信息(例如输入到 EditText 对象中的文本值)。因此,如果您的活动实例被销毁并重新创建,则布局的状态将恢复到之前的状态,而您不需要任何代码。但是,您的活动可能有更多您想要恢复的状态信息,例如跟踪用户在活动中的进度的成员变量。

在重新创建活动中阅读更多信息。

可序列化

默认情况下,序列化机制对对象的类名、其非瞬态字段(包括非公共字段)的名称以及所有这些字段的值进行编码。输出是一个不透明的字节序列。只要解码器具有原始类的兼容版本,就可以将这些字节解码为新的等效实例。更改类名、字段名或字段类型会破坏序列化兼容性,并使可序列化类的新旧版本之间的互操作性复杂化。添加或删除字段也会使类版本之间的序列化复杂化,因为它需要您的代码来处理丢失的字段。

阅读更多:http: //developer.android.com/reference/java/io/Serializable.html

包裹

Parcel API 的大部分内容围绕着读取和写入各种类型的数据

阅读更多: http: //developer.android.com/reference/android/os/Parcel.htmlhttp://developer.android.com/reference/android/os/Parcelable.html

捆绑文档:http: //developer.android.com/reference/android/os/Bundle.html

更多链接和帖子

希望有所帮助。

于 2014-05-30T12:40:28.910 回答
0

我不是在问我如何使用它,也不是在问它是做什么的,它是如何工作的。

Bundle实现Parcelable,所以它必须传递Objects给 a Parcel。我会假设这Bundles得到了HashMaps它们的关键、价值性质的支持。

显然他们只是没有忘记这样做,而不是 Bundle 的工作方式不是你可以做到的。

你说的对。他们没有忘记它。Bundles可用于进行 IPC(进程间通信),因此系统需要知道如何Object重新Bundle创建Parcelable. 这使您局限于相同的范式。如果你有一个自定义Object,它必须能够告诉 Android 如何跨进程重新构建自己;因此它需要实施Parcelable

于 2014-05-30T12:29:13.167 回答
0

Bundle实现Parcelable,因此您传递的所有对象都必须对 a 有效Parcel,否则。Bundle 不能作为Parcelable.

于 2014-05-30T12:24:44.350 回答