如何在Android上将一个对象从一个活动传递给另一个活动?
我需要能够在我的应用程序中的多个活动中使用一个对象,它需要是同一个对象。 什么是最好的方法来做到这一点?
我试图让对象“公共静态”,以便其他活动可以访问,但由于某种原因,这只是不削减它。 有没有另外一种方法呢?
在创build意图对象时,可以利用以下两种方法在两个活动之间传递对象。
putParcelable
putSerializable
你可以让你的类实现Parcelable或者Serializable 。 然后你可以通过活动传递你的自定义类。 我发现这非常有用。
这是我正在使用的一小段代码
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);
您可以创build应用程序的子类并将您的共享对象存储在那里。 只要存在某个活动组件,应用程序对象就应该存在于应用程序的整个生命周期中。
从您的活动中,您可以通过getApplication()
访问应用程序对象。
这个答案是特定于要传递的对象具有嵌套类结构的情况。 嵌套的类结构使得Parcelable或者Serializeable有点乏味。 而且, Android系统化对象的过程效率不高 。 考虑下面的例子,
class Myclass { int a; class SubClass { int b; } }
借助Google的GSON库 ,您可以直接将对象parsing为JSON格式的string,并在使用后将其转换回对象格式。 例如,
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表示中创build原始对象。
String target = getIntent().getStringExtra("MyObjectAsString"); MyClass src = gS.fromJson(target, MyClass.class); // Converts the JSON String to an Object
它保持原来的类清洁和可重用。 最重要的是,如果这些类对象是作为JSON对象从Web创build的,那么这个解决scheme非常有效且省时。
UPDATE
虽然上面解释的方法适用于大多数情况,但出于明显的性能原因,不要依赖Android的捆绑额外系统来传递对象。 有一些解决scheme使得这个过程变得灵活高效,这里有一些。 每个人都有自己的优点和缺点。
- Eventbus
- 玫瑰油
也许这是一个不受欢迎的答案,但是在过去,我只是简单地使用了一个静态引用的类,我想通过活动持久化这个对象。 所以,
public class PersonHelper { public static Person person; }
我尝试了下来的Parcelable接口path,但遇到了一些与它的问题,在你的代码开销对我来说是没有吸引力。
这取决于您需要访问的数据types。 如果你有一些需要在Activity
中保存的数据池,那么Erich的答案就是要走的路。 如果您只需要将一些对象从一个活动传递给另一个,那么您可以让它们实现Serializable
并将它们传递给Intent
的附加组件以启动新的Activity
。
你的对象也可以实现Parcelable接口。 然后你可以使用Bundle.putParcelable()
方法,并在intent之间的活动之间传递你的对象。
Photostream应用程序使用这种方法,可以用作参考。