的Android
我在网上阅读了很多用于在活动之间传递数据的例子。
我学到了什么:
在你说出来之前,是的,我当然错过了一些东西。
嗯,似乎有多种方法可以达到同样的目标。
如果我想传递一个自定义对象,Parcelable就是我的男人。但是我仍然需要“序列化”它,所以最后,我也会有原语,对吗?
要传递基元,为什么在直接传递意图时我还应该使用一个包呢?
android文档/论坛/博客示例并不适合我。我的C背景仍然让我退缩一点。
顺便说一句,为什么要有3种不同的方法来实现一个目标?
答案 0 :(得分:6)
但我仍然需要"序列化"它,所以最后,我也会有原语,对吧?
Java中的所有内容最终归结为原语。
要传递基元,为什么在直接传递意图时我还应该使用一个包呢?
无论哪种方式都有效。使用哪个让你感觉更舒服。但是,请注意密钥上的冲突(例如,您的活动以及您继承的某些基本活动,两者都试图将相同的内容放在Intent
或{{1}的相同密钥中})。
顺便说一句,为什么有3种不同的方法来实现一个目标?
我猜这个"一个目标"是将数据从一个活动传递到另一个活动"。这涉及进程间通信(IPC),即使这两个活动在同一进程中,因为路由中涉及核心OS进程。对于标准Android中来自Bundle
的流之外的所有内容,IPC意味着必须将数据放入ContentProvider
,然后将其转换为字节数组以跨越进程边界。
Parcel
表示可以添加到自定义类的接口,以允许将它们放入Parcelable
。
Parcel
是一个具体的类,它实现Bundle
并表示类似Parcelable
的结构,但强类型已知能够进入HashMap
的事物}。对于开发人员来说,Parcel
比Bundle
更方便,因为它提供了按键随机访问,Parcel
没有。
Parcel
个额外内容仅仅是Intent
,Bundle
公开了自己的访问者方法。
对于我的所有情况,我应该忘记其他可能性并且只使用Parcelable?
AFAIK,EpicPandaForce所指的是Intent
和Serializable
之间的比较。可以进入Parcelable
或Bundle
。在其中所有其他条件相同的情况下,Parcel
较慢,因为它假定序列化形式必须耐用,能够在数月或数年后再次读入。 Serializable
假设每个人都在使用相同的类定义,并且可以绕过一些Parcelable
开销。
话虽如此,它是一种微观优化。
为什么另一个还在那里呢?
并非所有内容都可以扩展Serializable
,特别是Parcelable
类。例如,java.*
不是Integer
。但是,我们希望能够传递Parcelable
和int
值。因此,Integer
支持Parcel
,int
支持{。}}。
你的意思是我应该用R.blah的东西取回它
AFAIK,在评论中,Marconcini先生指的是" id"作为一般概念,没有具体提到Bundle
值。例如,如果要维护图像缓存,而不是传递实际的R.id
个对象,请传递一些指向缓存的标识符。
答案 1 :(得分:1)
如果您传递的是非序列化的对象,建议使用Parcelable。这意味着您可以自己实现对象的可序列化表示,以确保数据是您期望在活动之间来回传递的数据。
如果您通过各种方式前后传递一个简单的id或字符串,请使用intent.putExtra()
我发现这篇文章对于帮助理解选项之间的差异和好处非常有用: http://www.developerphil.com/parcelable-vs-serializable/