为什么将对象列表从一个活动传递到另一个活动是如此麻烦

时间:2012-03-16 07:08:20

标签: android

我想知道,为什么Google会将如此困难传递给对象列表,从1个活动到另一个活动,即使我的活动都在一个进程内?

为什么他们不能只有像

这样的东西
intent.putExtra("histories", listOfHistoryObjects);

他们是否过于设计?

3 个答案:

答案 0 :(得分:6)

一个原因:

  1. 活动A启动活动B,处理它是一个直接指向对象的参数。
  2. 用户按下主页。
  3. 您的进程在后台被杀死。
  4. 用户返回您的应用。
  5. 现在重新创建活动B.
  6. Ooops,它应该运行的对象参数不再存在。
  7. 另一个原因:

    活动是代表应用程序主要部分的顶级组件。该平台跨过程管理它们;无论活动A和B是否在同一进程中运行,您提供给startActivity()的所有内容都必须通过IPC进入系统进程,系统进程会维护有关该活动的状态,并在活动B时将其交给您的进程。需要创建。它还通过重新启动您的流程来维护这一点。如果允许任何无法通过IPC边界传输的任意Java对象,它就无法做到这一点。

    如果您的UI元素紧密耦合,您可以使用Fragment来实现UI的各个部分。此类不是应用程序的顶级部分,也不提供跨进程使用的任何支持,因此可以轻松地在片段或片段及其活动之间进行直接交互。

    那说......这仍然不能消除你在第一种情况下正常工作的需要。如果您不打算对片段使用基于Bundle的参数(允许系统自动处理跨流程实例保存的数据),则需要注意实现onSaveInstanceState等正确在适当的状态下重新创建片段。

    另外请不要使用Serializable将对象存储到Parcel或Bundle中。正如http://developer.android.com/reference/android/os/Parcel.html#writeSerializable(java.io.Serializable)上的文档所说,与实现Parcelable(甚至只是使用Bundle中的内置基元)相比,这些效率极低。

答案 1 :(得分:1)

只要您保持单个进程,您可以使用标准java技术通过引用传递对象。不需要意图,单例容器在android中就好了。

答案 2 :(得分:0)

我认为你只需要在你的类中实现Serializable 接口。

之后你可以直接写:

intent.putExtra("histories", listOfHistoryObjects);

检查此example以获取详细说明。