我不是在问我如何使用它,也不是它做什么,它是如何工作的。当我为什么他们不放一个putExtra(String,Object)
这样我就可以传递一个对象时,我就想到了这个问题。显然,他们只是没有忘记这样做,而不是 Bundle 的工作方式不是您可以这样做的。
PS:Serializable
或Parcelable
是您无法在创建的每个类上实现的,因此它们不能替代putExtra(String,Object)
显然他们只是没有忘记这样做
正确。
Bundle
本身是Parcelable
的,正如多克托·道所指出的。Parcelable
背后的要点是能够将其放入Parcel
,而Parcel
背后的要点是跨进程边界传递数据。不能跨进程边界传递任意对象,就像不能将任意对象写入文件,也不能通过套接字流式传输任意对象一样。
基本上,可包裹或可序列化的类在通用二进制文件中使用包引用进行"转换"。这使您能够通过数据库、Intents
等传输和持久化数据。
这背后的想法是将某些Activity
或Fragment
的状态保留为状态机。
默认情况下,系统使用 Bundle 实例状态来保存 有关活动布局中每个 View 对象的信息(例如 输入到编辑文本对象中的文本值(。所以,如果你的活动 实例被销毁并重新创建,布局的状态为 还原到以前的状态,无需任何代码。然而 您的活动可能包含更多您想要的状态信息 还原,例如跟踪用户进度的成员变量 活动。
有关详细信息,请参阅重新创建活动。
序列 化
默认情况下,序列化机制对对象的类进行编码 名称,其非瞬态字段的名称(包括非公共字段 字段(,以及所有这些字段的值。输出是一个 不透明的字节序列。这些字节可以解码为新的, 等效实例,只要解码器具有兼容的 原始类。更改类名、字段名称或字段 类型破坏序列化兼容性并使序列化复杂化 可序列化的旧版本和新版本之间的互操作性 .class。添加或删除字段也会使序列化复杂化 在类的版本之间,因为它需要您的代码来应对 缺少字段。
阅读更多: http://developer.android.com/reference/java/io/Serializable.html
包裹
包裹 API 的大部分内容都围绕着读取和写入 各种类型。
阅读更多:http://developer.android.com/reference/android/os/Parcel.html 和 http://developer.android.com/reference/android/os/Parcelable.html
捆绑包文档:http://developer.android.com/reference/android/os/Bundle.html
更多链接和帖子
- http://shri.blog.kraya.co.uk/2010/04/26/android-parcel-data-to-pass-between-activities-using-parcelable-classes/
- http://www.developerphil.com/parcelable-vs-serializable/
- 使用可包裹对象而不是序列化对象的好处
希望有所帮助。
Bundle
实现Parcelable
因此您传递的所有对象都必须对Parcel
有效,否则。捆绑包不能用作传递Parcelable
。
我不是在问我如何使用它,也不是问它做什么,它是如何工作的。
Bundle
实现Parcelable
,所以它必须Objects
传递给Parcel
。我认为Bundles
是有HashMaps
支持的,因为它们的关键,价值性质。
显然他们只是没有忘记这样做,而不是捆绑的方式 作品不是你可以做的。
你是对的。他们没有忘记。 Bundles
可以用来做IPC(进程间通信(,所以系统需要知道如何重新创建一个Object
,因此Bundle
实现Parcelable
。这使您仅限于相同的范式。如果你有一个自定义Object
它必须能够告诉Android如何跨进程重建自己;因此,它需要实现Parcelable
。