android - java - 通过 intents、bundle 或 Parcelables 传递值?
android - java - pass values through intents, bundles or Parcelables?
上下文:
Android
我在网上阅读了很多关于在活动之间传递数据的示例。
我学到了什么:
- 通过 Intents 传递原始数据 (intent.putExtra(key,value))
- 捆绑原始数据并将其放入intent.putExtra(key,bundle object)
- Parcelables -> 用于复杂对象和基元。
在你说之前,是的,我肯定漏掉了什么。
问题:
好吧,似乎有多种方法可以实现相同的目标。
如果我想传递自定义对象,Parcelable 就是我的人选。但是我仍然需要“序列化”它,所以最后,我也会有原语,对吗?
要传递原语,直接传入 intent 时为什么要使用 bundle?
android 文档/论坛/博客示例不适合我。我的 C 背景仍然让我有点退缩。
为什么有 3 种不同的方法来实现一个目标,顺便说一句?
BUT I will still have to "serialize" it, so in the end, I will also have primitives, right ?
几乎 Java 中的所有内容最终都归结为原语。
To pass primitives, why should I use a bundle when passing directly in an intent will make it too ?
两种方法都行。使用使您感觉更舒适的任何一种。但是,请注意键上的冲突(例如,您的 activity 和您继承自的某个基础 activity,两者都试图将相同的东西放在 [= 的同一个键中10=] 或 Bundle
).
Why having 3 different ways to achieve one goal, by the way ?
我猜 "one goal" 是 "to pass data from one activity to another"。这涉及进程间通信 (IPC),即使这两个活动在同一进程中,因为路由中涉及核心 OS 进程。对于来自标准 Android 中的 ContentProvider
流之外的几乎所有内容,IPC 意味着数据必须放入 Parcel
中,它被转换为字节数组以在整个过程中传递边界.
Parcelable
表示可以添加到自定义 classes 的接口,以允许将它们放入 Parcel
.
Bundle
是一个具体的 class,它实现了 Parcelable
并代表了一个类似 HashMap
的结构,但是强类型化为已知能够去的东西变成 Parcel
。 Bundle
对于开发人员来说比 Parcel
更方便,因为它提供了按键随机访问,而 Parcel
则没有。
Intent
extras 只是一个 Bundle
,Intent
公开了它自己的访问器方法。
For all my cases, I should forget about the other possibilities and only use Parcelable ?
据我所知,EpicPandaForce 指的是 Serializable
和 Parcelable
之间的比较。可以进入 Bundle
或 Parcel
。在两者中,在其他条件相同的情况下,Serializable
较慢,因为它假定序列化形式必须持久,能够在数月或数年后再次读取。 Parcelable
假设每个人都在使用相同的 class 定义,因此可以绕过一些 Serializable
开销。
也就是说,这是一个微优化。
Why are the other still there then ?
并非所有内容都可以扩展 Parcelable
,尤其是 java.*
classes。例如,Integer
不是 Parcelable
。然而,我们希望能够传递 int
和 Integer
值。因此,Parcel
支持 int
,Bundle
.
也是如此
you mean that I should get it back with the R.blah thing
AFAIK,在该评论中,Marconcini 先生指的是 "id" 作为一般概念,而不是具体指 R.id
值。例如,如果您要维护图像缓存,而不是传递实际的 Bitmap
对象,而是传递一些指向缓存的标识符。
如果您要传递不可序列化的对象,建议使用 Parcelable。这意味着您可以自己实现对象的可序列化表示,以确保数据是您希望在活动之间来回传递的数据。
如果您要前后传递一个简单的 ID 或字符串,请务必使用 intent.putExtra()
我发现这篇关于该主题的文章非常有用,有助于理解选项之间的差异和优势:
http://www.developerphil.com/parcelable-vs-serializable/
上下文:
Android
我在网上阅读了很多关于在活动之间传递数据的示例。
我学到了什么:
- 通过 Intents 传递原始数据 (intent.putExtra(key,value))
- 捆绑原始数据并将其放入intent.putExtra(key,bundle object)
- Parcelables -> 用于复杂对象和基元。
在你说之前,是的,我肯定漏掉了什么。
问题:
好吧,似乎有多种方法可以实现相同的目标。
如果我想传递自定义对象,Parcelable 就是我的人选。但是我仍然需要“序列化”它,所以最后,我也会有原语,对吗?
要传递原语,直接传入 intent 时为什么要使用 bundle?
android 文档/论坛/博客示例不适合我。我的 C 背景仍然让我有点退缩。
为什么有 3 种不同的方法来实现一个目标,顺便说一句?
BUT I will still have to "serialize" it, so in the end, I will also have primitives, right ?
几乎 Java 中的所有内容最终都归结为原语。
To pass primitives, why should I use a bundle when passing directly in an intent will make it too ?
两种方法都行。使用使您感觉更舒适的任何一种。但是,请注意键上的冲突(例如,您的 activity 和您继承自的某个基础 activity,两者都试图将相同的东西放在 [= 的同一个键中10=] 或 Bundle
).
Why having 3 different ways to achieve one goal, by the way ?
我猜 "one goal" 是 "to pass data from one activity to another"。这涉及进程间通信 (IPC),即使这两个活动在同一进程中,因为路由中涉及核心 OS 进程。对于来自标准 Android 中的 ContentProvider
流之外的几乎所有内容,IPC 意味着数据必须放入 Parcel
中,它被转换为字节数组以在整个过程中传递边界.
Parcelable
表示可以添加到自定义 classes 的接口,以允许将它们放入 Parcel
.
Bundle
是一个具体的 class,它实现了 Parcelable
并代表了一个类似 HashMap
的结构,但是强类型化为已知能够去的东西变成 Parcel
。 Bundle
对于开发人员来说比 Parcel
更方便,因为它提供了按键随机访问,而 Parcel
则没有。
Intent
extras 只是一个 Bundle
,Intent
公开了它自己的访问器方法。
For all my cases, I should forget about the other possibilities and only use Parcelable ?
据我所知,EpicPandaForce 指的是 Serializable
和 Parcelable
之间的比较。可以进入 Bundle
或 Parcel
。在两者中,在其他条件相同的情况下,Serializable
较慢,因为它假定序列化形式必须持久,能够在数月或数年后再次读取。 Parcelable
假设每个人都在使用相同的 class 定义,因此可以绕过一些 Serializable
开销。
也就是说,这是一个微优化。
Why are the other still there then ?
并非所有内容都可以扩展 Parcelable
,尤其是 java.*
classes。例如,Integer
不是 Parcelable
。然而,我们希望能够传递 int
和 Integer
值。因此,Parcel
支持 int
,Bundle
.
you mean that I should get it back with the R.blah thing
AFAIK,在该评论中,Marconcini 先生指的是 "id" 作为一般概念,而不是具体指 R.id
值。例如,如果您要维护图像缓存,而不是传递实际的 Bitmap
对象,而是传递一些指向缓存的标识符。
如果您要传递不可序列化的对象,建议使用 Parcelable。这意味着您可以自己实现对象的可序列化表示,以确保数据是您希望在活动之间来回传递的数据。
如果您要前后传递一个简单的 ID 或字符串,请务必使用 intent.putExtra()
我发现这篇关于该主题的文章非常有用,有助于理解选项之间的差异和优势: http://www.developerphil.com/parcelable-vs-serializable/