我需要能在应用程序的多个活动中使用一个对象,并且它需要是相同的对象。最好的方法是什么?
我已经尝试将对象设置为“public static”,以便其他活动可以访问它,但出于某种原因,这并不能解决问题。还有其他的方法吗?
我需要能在应用程序的多个活动中使用一个对象,并且它需要是相同的对象。最好的方法是什么?
我已经尝试将对象设置为“public static”,以便其他活动可以访问它,但出于某种原因,这并不能解决问题。还有其他的方法吗?
当您创建一个意图对象时,可以利用以下两种方法在两个活动之间传递对象。
您可以让您的类实现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);
你可以创建一个 Application 的子类并将共享对象存储在其中。只要有活动组件存在,应用程序对象就应该在应用程序的生命周期内存在。
从你的活动中,可以通过 getApplication()
访问应用程序对象。
本答案特别针对对象具有嵌套类结构的情况。在具有嵌套类结构的情况下,使其可 Parcelable 或 Serializable 有点繁琐。而且,在 Android 上序列化对象的过程不够高效。请考虑以下示例:
class Myclass {
int a;
class SubClass {
int b;
}
}
MyClass src = new MyClass();
Gson gS = new Gson();
String target = gS.toJson(src); // Converts the object to a JSON String
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 对象创建的,则该解决方案非常高效且节省时间。
更新
public class PersonHelper
{
public static Person person;
}
我曾尝试使用Parcelable接口,但是遇到了一些问题,而且它会增加代码的开销,这让我不太满意。
这取决于您需要访问的数据类型。如果您有一些需要在Activity
之间持久存在的数据池,则Erich的答案是正确的选择。如果您只需要从一个活动传递几个对象到另一个活动,则可以让它们实现Serializable
并将它们作为Intent
的附加项传递给启动新Activity
。
您的对象还可以实现Parcelable接口。然后,您可以使用Bundle.putParcelable()方法在意图之间传递对象。
Photostream 应用程序使用此方法,并可用作参考。
i.putExtras(b)
中为什么要将一个Bundle
作为额外的参数,而不直接通过Intent.putExtra(String name,Parcelable value)
方法将Parcelable
对象直接放入,并通过Intent.getParcelableExtra(String name)
方法检索? - Tony Chan