2010-05-25 89 views

回答

133

当您创建意图的对象,你可以采取以下两种方法 传递两项活动间的对象的优势。

putParcelable

putSerializable

可以让你的类实现无论ParcelableSerializable。然后,您可以跨活动传递自定义课程。我发现这非常有用。

这里是一小段代码,我使用

CustomListing currentListing = new CustomListing(); 
Intent i = new Intent(); 
Bundle b = new Bundle(); 
b.putParcelable(Constants.CUSTOM_LISTING, currentListing); 
i.putExtras(b); 
i.setClass(this, SearchDetailsActivity.class); 
startActivity(i); 

和新开工活动代码会是这样的......

Bundle b = this.getIntent().getExtras(); 
if (b != null) 
    mCurrentListing = b.getParcelable(Constants.CUSTOM_LISTING); 
+2

我很久以前就解决了这个问题,但我认为你的答案值得接受。 – mtmurdock 2011-10-28 01:40:56

+0

你能告诉我你是如何实现Parcelable方法的吗? currentListing应该是Parcelable类型的权利? – Namratha 2012-06-11 08:13:53

+0

是的,你将不得不实现一个接口Parcelable并提供实现。所以它基本上具有从包裹创建实际对象并将数据写入包裹的方法。 – anargund 2012-06-11 23:48:29

36

您可以创建Application的子类并在其中存储您的共享对象。只要存在某个活动组件,应用程序对象就应该存在于应用程序的整个生命周期中。

从您的活动中,您可以通过getApplication()访问应用程序对象。

+3

确定这是新的我。我将如何实现? – mtmurdock 2010-05-25 19:20:04

+0

我最终做的是让对象成为我的启动活动的受保护成员,然后直接从其他活动引用变量。这不完全是Erich的答案,但是他的答案给了我这个想法 – mtmurdock 2010-06-19 04:22:01

+0

如何将应用程序的子类设置为您的应用程序? @mtmurdock你是如何将第一个活动的实例传递给其他人的? – Tenfour04 2011-02-11 01:20:43

5

这取决于您需要访问的数据类型。如果你有某种数据池需要在Activity之间持续存在,那么Erich的答案就是要走的路。如果您只需要将一些对象从一项活动传递给另一项,则可以让它们执行Serializable并将它们传递到Intent的附加项中,以启动新的Activity

+0

这可能是最好的解决方案,只要你的对象不需要坚持应用程序的生命(这是由@Erich Douglas的答案覆盖)。 – mtmurdock 2011-06-01 21:41:03

4

您的对象也可以实现Parcelable接口。然后,您可以使用Bundle.putParcelable()方法并在意图内的活动之间传递您的对象。

Photostream应用程序使用此方法,并且可以被用作参考。

6

也许这是一个不受欢迎的答案,但在过去,我只是用具有静态参考我想通过活动来持久化对象的类。所以,

public class PersonHelper 
{ 
    public static Person person; 
} 

我想下去了Parcelable接口路径,但遇到了一些与它的问题,并在你的代码的开销是没有吸引力了我。

+0

这是一个很好的解决方案,但并不总是最好的选择。如果你不喜欢Parcelable,并且如果你的对象可以简化为原始类型(int,float,double,boolean)和Strings,那么实现Serializable接口很容易。几乎没有你的工作,并有很少的开销。 – mtmurdock 2011-06-01 21:44:33

+1

@mtmurdock:序列化对象是序列化时状态的“快照”吗?我需要将一个对象传递给一个服务,该服务会在服务的运行时发生变化。该服务应始终使用最新的对象,而不是旧的,准复制的对象。 – stk 2011-07-07 14:29:00

+1

@stk是的,序列化对象是一个快照。更准确地说,它是一个副本,这意味着在一个活动中更改它不会影响其他活动,除非您将其传回。服务是一个很好的方法,但我可以理解为什么有人会觉得这有点矫枉过正。另一个解决方案是使用Android内置的持久对象存储来保存数据。它可能会也可能不适合您的需求,但是如果您需要能够在整个应用程序中获取/设置值,那么这不是一个糟糕的解决方案,并且可以用来保存持久数据。 – mtmurdock 2011-07-08 16:22:59

35

这个答案是特定的情景,要传递的对象具有嵌套的类结构。使用嵌套类结构,使其可Parcelable或Serializeable有点繁琐。并且,序列化对象的过程是not efficient on Android。考虑下面的例子中,

class Myclass { 
    int a; 
    class SubClass { 
     int b; 
    } 
} 

随着谷歌的GSON library,您可以直接解析对象成JSON格式的字符串,并使用后,将其转换回对象格式。例如,

MyClass src = new MyClass(); 
Gson gS = new Gson(); 
String target = gS.toJson(src); // Converts the object to a JSON String 

现在,您可以通过活动意图将该String作为StringExtra传递给活动。

Intent i = new Intent(FromActivity.this, ToActivity.class); 
i.putExtra("MyObjectAsString", target); 

然后在接收活动中,从字符串表示中创建原始对象。

String target = getIntent().getStringExtra("MyObjectAsString"); 
MyClass src = gS.fromJson(target, MyClass.class); // Converts the JSON String to an Object 

它保持原始类的清洁和可重用。最重要的是,如果这些类对象是作为JSON对象从Web创建的,那么这个解决方案非常有效且省时。

UPDATE


虽然上述解释的方法适用于大多数情况下,出于明显的性能的原因,不依赖Android的捆绑,额外的系统是传递对象。有许多解决方案使这个过程变得灵活高效,这里有一些。每个人都有自己的优点和缺点。

  1. Eventbus
  2. Otto
+0

这是最好的答案 – 2014-01-18 17:00:45

+1

序列化为GSON高效?速度够快吗? – osrl 2015-03-16 09:53:37

+1

@osrl对于pojos,Gson的工作速度非常快。虽然建议使用事件总线解决方案。请参阅答案中的更新。 – 2015-08-25 05:00:21

相关问题