为什么我们需要可序列化的对象将一个活动传递到Android中的另一个活动

时间:2012-08-11 09:58:21

标签: java android

有人可以告诉我们为什么需要serializable对象将一个活动传递给android中的另一个活动吗? Android遵循Java语法。在java中,我们可以将对象传递给另一个没有可序列化的类。

由于

4 个答案:

答案 0 :(得分:13)

在传递参数(对象类型)的普通java程序中,有一种为对象创建一个新的处理程序并赋予另一个方法(在常规单词中按值传递引用)。

但是当它出现在android中时,将对象引用从活动传递到活动,其状态必须持久化,这是一个严重的问题。

您可以做的一种方法是在第一个活动中创建一个静态对象,然后从第二个活动中创建一个静态对象,尽管这似乎是最简单的方法there is no guarantee that the system maintains the activity in the memory。因此,第二个活动可能会丢失对象引用。

其他方式,最常推荐的方法是序列化(对象展平对象)对象并以intent作为额外传递。在android中有两种序列化方法。

  1. 实现java的serializable接口
  2. 实施android的parcelable界面
  3. 然而,在android上,使用serializable会带来严重的性能损失,解决方案是使用parcelable。

    你可以在android parcelable实现here找到一个非常好的教程和解释。

答案 1 :(得分:8)

在得到答案之前,我们需要了解以下概念:

  • Android使用Binder进行进程间处理。即使对于简单的应用程序也是如此,因为操作系统和应用程序在不同的进程中运行。
  • 编组: 将更高级别的应用程序数据结构转换为parcel以便嵌入到Binder事务中的过程
  • 解组 通过活页夹事务从包裹中重建更高级别应用程序数据结构的过程。
  • 您可以将Intents视为Binder
  • 的更高级别抽象

基于documentation以下是意图通信的发生方式: enter image description here

  
      
  1. 活动A创建一个带有动作描述的Intent并传递   它来startActivity()。

  2.   
  3. Android系统会搜索所有应用以获取意图过滤器   匹配意图。找到匹配项后,

  4.   
  5. 系统通过调用启动匹配活动(活动B)   它的onCreate()方法并将其传递给Intent。

  6.   

为何选择Parcelable或Serializable

IPC(进程间通信)要求Intent中的数据为Marshalled和unMarshalled。 Binder为编组许多常见数据类型提供内置支持。但是,当我们定义自定义对象时,它会影响此过程,并且在此过程中收到的最终对象可能已损坏。

当你定义自定义对象时,你需要负责提供这种通过Parcelable和Serializable实现的编组和解组(因为这两者之间的比较将是我赢得的另一个主题,在这里讨论很多)。这两者都提供了执行编组和解组的机制。这就是您需要使用Parcelable或Serializable的原因。

使用 Parcelable 编写用于编组和解组对象的自定义代码,从而您可以完全控制该过程。

Serializable 是一个标记界面,这意味着用户无法根据他们的要求和JVM完成数据编组,JVM没有给予您任何控制权。

  

免责声明:以上说明是我对基于某些需要序列化的理由的理解   文档

答案 2 :(得分:3)

你的问题基本上有两个问题,所以让我们解开它。

为什么要在Parcelable中编组而不是直接传递对象引用?

引用对象显然更快,内存效率更高,而不是对它们进行编组/解组。因此,当您可以直接传递对象时,不应使用Parcelable。

但是,您可能无法访问对象引用。

  • Intent中,因为处理Intent的进程可能不是发出Intent的进程(这是进程间通信)
  • Activity生命周期中,例如在onRestoreState()中,因为当用户想要恢复时,整个应用可能已被memkiller杀死。
  • Android框架需要的其他地方

在IPC中,为什么使用Parcelable而不是像Java那样使用Serializable?

那只是performance optimization

答案 3 :(得分:2)

如果我们想将对象从Activity传递给Another Activity。我们需要保存通过状态。

//to pass :
   intent.putExtra("MyClass", obj);  

// to retrieve object in second Activity
getIntent().getSerializableExtra("MyClass");