【发布时间】:2011-02-23 19:35:25
【问题描述】:
我需要能够在我的应用程序的多个活动中使用一个对象,并且它必须是 相同的 对象。做这个的最好方式是什么?
我尝试将对象设置为“公共静态”,以便其他活动可以访问它,但由于某种原因,这并没有削减它。还有其他方法吗?
【问题讨论】:
标签: android object android-activity
我需要能够在我的应用程序的多个活动中使用一个对象,并且它必须是 相同的 对象。做这个的最好方式是什么?
我尝试将对象设置为“公共静态”,以便其他活动可以访问它,但由于某种原因,这并没有削减它。还有其他方法吗?
【问题讨论】:
标签: android object android-activity
当您创建意图对象时,您可以利用以下两种方法 用于在两个活动之间传递对象。
您可以让您的类实现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);
【讨论】:
Bundle 作为额外的i.putExras(b) 而不是简单地通过Intent.putExtra(String name,Parcelable value) 直接放置Parcelable 对象,然后通过Intent.getParcelableExtra(String name) 检索?
您可以创建Application 的子类并将您的共享对象存储在那里。只要有一些活动组件,Application 对象就应该存在于您的应用程序的整个生命周期中。
从您的活动中,您可以通过getApplication() 访问应用程序对象。
【讨论】:
此答案特定于要传递的对象具有嵌套类结构的情况。使用嵌套类结构,使其 Parcelable 或 Serializeable 有点繁琐。并且,序列化对象的过程是not efficient on Android。考虑下面的例子,
class Myclass {
int a;
class SubClass {
int b;
}
}
使用谷歌的GSON library,可以直接将一个对象解析为JSON格式的String,使用后转换回对象格式。例如,
MyClass src = new MyClass();
Gson gS = new Gson();
String target = gS.toJson(src); // Converts the object to a JSON 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 的捆绑额外系统来传递对象。有许多解决方案使这个过程灵活高效,这里有一些。每个都有自己的优点和缺点。
【讨论】:
也许这是一个不受欢迎的答案,但在过去,我只是简单地使用了一个类,该类具有对我想通过活动持续存在的对象的静态引用。所以,
public class PersonHelper
{
public static Person person;
}
我尝试使用 Parcelable 接口路径,但遇到了许多问题,而且代码中的开销对我没有吸引力。
【讨论】:
这取决于您需要访问的数据类型。如果您有某种需要在Activitys 中持续存在的数据池,那么 Erich 的答案就是要走的路。如果您只需要将一些对象从一个活动传递到另一个活动,那么您可以让它们实现Serializable 并将它们传递到Intent 的附加部分中以启动新的Activity。
【讨论】:
您的对象也可以实现 Parcelable 接口。然后您可以使用Bundle.putParcelable() 方法并在意图内的活动之间传递您的对象。
Photostream 应用程序使用这种方法,可以用作参考。
【讨论】: