android - java - 通过意图,包或Parcelables传递值?

时间:2015-04-13 14:33:25

标签: java android android-intent bundle parcelable

上下文:

的Android

我在网上阅读了很多用于在活动之间传递数据的例子。

我学到了什么:

  • 通过Intents传递原始数据(intent.putExtra(key,value))
  • 捆绑原始数据并将其放入intent.putExtra(密钥,捆绑对象)
  • Parcelables - >对于复杂的对象和基元。

在你说出来之前,是的,我当然错过了一些东西。

问题:

嗯,似乎有多种方法可以达到同样的目标。

如果我想传递一个自定义对象,Parcelable就是我的男人。但是我仍然需要“序列化”它,所以最后,我也会有原语,对吗?

要传递基元,为什么在直接传递意图时我还应该使用一个包呢?

android文档/论坛/博客示例并不适合我。我的C背景仍然让我退缩一点。

顺便说一句,为什么要有3种不同的方法来实现一个目标?

2 个答案:

答案 0 :(得分:6)

  

但我仍然需要"序列化"它,所以最后,我也会有原语,对吧?

Java中的所有内容最终归结为原语。

  

要传递基元,为什么在直接传递意图时我还应该使用一个包呢?

无论哪种方式都有效。使用哪个让你感觉更舒服。但是,请注意密钥上的冲突(例如,您的活动以及您继承的某些基本活动,两者都试图将相同的内容放在Intent或{{1}的相同密钥中})。

  

顺便说一句,为什么有3种不同的方法来实现一个目标?

我猜这个"一个目标"是将数据从一个活动传递到另一个活动"。这涉及进程间通信(IPC),即使这两个活动在同一进程中,因为路由中涉及核心OS进程。对于标准Android中来自Bundle的流之外的所有内容,IPC意味着必须将数据放入ContentProvider,然后将其转换为字节数组以跨越进程边界。

Parcel表示可以添加到自定义类的接口,以允许将它们放入Parcelable

Parcel是一个具体的类,它实现Bundle并表示类似Parcelable的结构,但强类型已知能够进入HashMap的事物}。对于开发人员来说,ParcelBundle更方便,因为它提供了按键随机访问,Parcel没有。

Parcel个额外内容仅仅是IntentBundle公开了自己的访问者方法。

  

对于我的所有情况,我应该忘记其他可能性并且只使用Parcelable?

AFAIK,EpicPandaForce所指的是IntentSerializable之间的比较。可以进入ParcelableBundle。在其中所有其他条件相同的情况下,Parcel较慢,因为它假定序列化形式必须耐用,能够在数月或数年后再次读入。 Serializable假设每个人都在使用相同的类定义,并且可以绕过一些Parcelable开销。

话虽如此,它是一种微观优化。

  

为什么另一个还在那里呢?

并非所有内容都可以扩展Serializable,特别是Parcelable类。例如,java.*不是Integer。但是,我们希望能够传递Parcelableint值。因此,Integer支持Parcelint支持{。}}。

  

你的意思是我应该用R.blah的东西取回它

AFAIK,在评论中,Marconcini先生指的是" id"作为一般概念,没有具体提到Bundle值。例如,如果要维护图像缓存,而不是传递实际的R.id个对象,请传递一些指向缓存的标识符。

答案 1 :(得分:1)

如果您传递的是非序列化的对象,建议使用Parcelable。这意味着您可以自己实现对象的可序列化表示,以确保数据是您期望在活动之间来回传递的数据。

如果您通过各种方式前后传递一个简单的id或字符串,请使用intent.putExtra()

我发现这篇文章对于帮助理解选项之间的差异和好处非常有用: http://www.developerphil.com/parcelable-vs-serializable/