在Android上,如何将对象从一个活动传递到另一个活动?

在Android上,如何将对象从一个活动传递到另一个活动?,android,object,android-activity,Android,Object,Android Activity,我需要能够在我的应用程序中的多个活动中使用一个对象,并且它必须是同一个对象。最好的方法是什么 我曾尝试将对象设置为“publicstatic”,以便其他活动可以访问它,但由于某些原因,这并不能解决这个问题。还有其他方法吗?您可以创建共享对象的子类并将其存储在其中。只要存在一些活动组件,应用程序对象就应该在应用程序的生命周期内存在 从您的活动中,您可以通过getApplication()访问应用程序对象,这取决于您需要访问的数据类型。如果您有某种类型的数据池需要在活动s中持久化,那么Erich的答

我需要能够在我的应用程序中的多个活动中使用一个对象,并且它必须是同一个对象。最好的方法是什么


我曾尝试将对象设置为“publicstatic”,以便其他活动可以访问它,但由于某些原因,这并不能解决这个问题。还有其他方法吗?

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


从您的活动中,您可以通过
getApplication()

访问应用程序对象,这取决于您需要访问的数据类型。如果您有某种类型的数据池需要在
活动
s中持久化,那么Erich的答案是可行的。如果您只需要将几个对象从一个活动传递到另一个活动,那么您可以让它们实现
可序列化
,并在
意图
的附加部分中传递它们,以启动新的
活动

您的对象还可以实现可打包界面。然后,您可以使用
Bundle.putParcelable()
方法在intent中的活动之间传递对象


应用程序使用这种方法,可以用作引用。

也许这是一个不受欢迎的答案,但在过去,我只使用了一个类,该类对我希望通过活动持久化的对象具有静态引用。所以

public class PersonHelper
{
    public static Person person;
}

我尝试沿着Parcelable接口路径,但遇到了许多问题,代码中的开销对我没有吸引力。

当您创建意图对象时,可以利用以下两种方法 用于在两个活动之间传递对象

您可以让类实现或。然后,您可以在活动之间传递自定义类。我发现这很有用

下面是我正在使用的一小段代码

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);

此答案特定于要传递的对象具有嵌套类结构的情况。对于嵌套类结构,使其可分组或可序列化有点繁琐。而且,序列化对象的过程非常简单。考虑下面的例子,

class Myclass    {
  int a;
  class SubClass    {
       int b;
  }
}
使用Google的,您可以直接将对象解析为JSON格式的字符串,并在使用后将其转换回对象格式。比如说,

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
它保持了原始类的干净性和可重用性。最重要的是,如果这些类对象是作为JSON对象从web创建的,那么这个解决方案是非常高效和节省时间的

更新


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


  • 好的,这对我来说是新的。我将如何实现它?我最终实际做的是使对象成为我的启动活动的受保护成员,然后直接从其他活动引用变量。这不完全是埃里克的答案,但正是他的答案给了我答案idea@TenFour04通过清单中的元素进行设置。@TenFour04这是很久以前的事了,我的方法已经改变了很多。我找到了很多方法来解决这个问题。从可通过类访问器访问的单例对象到实现可序列化接口的任何内容。基本上,我没有试图回避这个问题,而是支持谷歌的方法论。但是,如果所讨论的对象需要存在于应用程序范围内,@Erich的回答是一个很好的解决方案。我还认为这是一个坏主意,因为当应用程序进程终止时,应用程序对象及其所有局部变量都会被破坏。当用户希望从最近的应用程序堆栈再次打开应用程序时,它会重新创建上次显示的活动。如果此活动依赖于应用程序对象中以前存储的值,则会遇到问题,因为这些值不再存在。有关更多信息,请参阅这篇博文:这可能是最好的解决方案,只要您的对象不需要在应用程序的整个生命周期内保持不变(这在@Erich Douglas的回答中有介绍)。这是一个很好的解决方案,但并不总是最好的选择。如果您不喜欢Parcelable,并且如果您的对象可以简化为原语(int、float、double、boolean)和字符串,那么实现Serializable接口非常容易。实际上您没有工作,开销也很小。@mtmurdock:序列化对象是序列化时状态的“快照”吗?我需要向服务传递一个对象,该对象会在服务的运行时发生变化。服务应始终使用最新的对象,而不是旧的、准复制的对象。@stk是的,序列化对象是快照。更准确地说,它是一个副本,这意味着在一个活动中更改它不会影响另一个活动,除非您将其传回。服务是一种很好的方式,但我能理解为什么有人会觉得这有点过分。另一个解决方案是使用安卓内置的持久对象存储来保存数据。它可能适合您的需要,也可能不适合您的需要,但如果您需要在整个应用程序中获取/设置值,这是一个不错的解决方案,可以用于保存持久数据。我很久以前就解决了这个问题,但我认为您的答案值得接受。您能告诉我您是如何实现可打包方法的吗?currentListing应该是Parcelable类型,对吗?当然,它来自我自己的类,不是标准的android类。我要说的就是用一些常量作为键!是否有一个r