我需要能够在我的应用程序中的多个活动中使用一个对象,并且它需要是相同的对象。做这个的最好方式是什么?
我已经尝试将对象设置为“public static”,因此可以通过其他活动访问它,但出于某种原因,这并不是在削减它。还有另一种方法吗?
答案 0 :(得分:138)
创建意图对象时,可以使用以下两种方法 用于在两个活动之间传递对象。
您可以让您的班级实施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);
答案 1 :(得分:37)
您可以创建Application的子类并将共享对象存储在那里。只要存在一些活动组件,Application对象就应该存在于应用程序的生命周期中。
通过您的活动,您可以通过getApplication()
访问应用程序对象。
答案 2 :(得分:35)
此答案特定于要传递的对象具有嵌套类结构的情况。使用嵌套类结构,使其成为Parcelable或Serializeable有点单调乏味。而且,序列化对象的过程是not efficient on Android。考虑下面的例子,
class Myclass {
int a;
class SubClass {
int b;
}
}
使用Google的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
它使原始类保持清洁和可重用。最重要的是,如果这些类对象是从Web创建为JSON对象的,那么这个解决方案非常有效且省时。
<强>更新强>
虽然上述解释方法适用于大多数情况,但出于明显的性能原因,请不要依赖Android的捆绑额外系统来传递对象。有许多解决方案使这个过程灵活高效,这里有一些。每个人都有自己的优点和缺点。
答案 3 :(得分:6)
也许这是一个不受欢迎的答案,但在过去,我只是使用了一个对我希望通过活动持久存在的对象有静态引用的类。所以,
public class PersonHelper
{
public static Person person;
}
我尝试了Parcelable接口路径,但遇到了很多问题,代码中的开销对我来说没什么吸引力。
答案 4 :(得分:5)
这取决于您需要访问的数据类型。如果你有某种数据池需要在Activity
之间持续存在,那么Erich的答案就是要走的路。如果您只需要将一个对象从一个活动传递到另一个活动,那么您可以让它们实现Serializable
并将其传递到Intent
的额外内容中以启动新的Activity
。
答案 5 :(得分:5)
您的对象也可以实现Parcelable接口。然后,您可以使用Bundle.putParcelable()
方法,并在意图内的活动之间传递您的对象。
Photostream应用程序使用此方法,可以用作参考。