android - java - 通过 intents、bundle 或 Parcelables 传递值?

android - java - pass values through intents, bundles or Parcelables?

上下文:

Android

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

我学到了什么:

在你说之前,是的,我肯定漏掉了什么。

问题:

好吧,似乎有多种方法可以实现相同的目标。

如果我想传递自定义对象,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 的结构,但是强类型化为已知能够去的东西变成 ParcelBundle 对于开发人员来说比 Parcel 更方便,因为它提供了按键随机访问,而 Parcel 则没有。

Intent extras 只是一个 BundleIntent 公开了它自己的访问器方法。

For all my cases, I should forget about the other possibilities and only use Parcelable ?

据我所知,EpicPandaForce 指的是 SerializableParcelable 之间的比较。可以进入 BundleParcel。在两者中,在其他条件相同的情况下,Serializable 较慢,因为它假定序列化形式必须持久,能够在数月或数年后再次读取。 Parcelable 假设每个人都在使用相同的 class 定义,因此可以绕过一些 Serializable 开销。

也就是说,这是一个微优化。

Why are the other still there then ?

并非所有内容都可以扩展 Parcelable,尤其是 java.* classes。例如,Integer 不是 Parcelable。然而,我们希望能够传递 intInteger 值。因此,Parcel 支持 intBundle.

也是如此

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/