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

mtm*_*ock 123 android object android-activity

我需要能够在我的应用程序中的多个活动中使用一个对象,并且它需要是同一个对象.做这个的最好方式是什么?

我已经尝试将对象设置为"公共静态",因此可以通过其他活动访问它,但由于某种原因,这并没有削减它.还有另一种方法吗?

ana*_*und 139

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

putParcelable

putSerializable

您可以让您的类实现ParcelableSerializable.然后,您可以跨活动传递自定义类.我发现这非常有用.

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

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);
Run Code Online (Sandbox Code Playgroud)

在新开始的活动代码将是这样的......

Bundle b = this.getIntent().getExtras();
if (b != null)
    mCurrentListing = b.getParcelable(Constants.CUSTOM_LISTING);
Run Code Online (Sandbox Code Playgroud)

  • 有没有理由把`Bundle`作为额外的`i.putExras(b)`而不是直接通过[`Intent.putExtra(String name,Parcelable value)`放入`Parcelable`对象`(http: //developer.android.com/reference/android/content/Intent.html#putExtra(java.lang.String,android.os.Parcelable))然后通过[`Intent.getParcelableExtra(String name)`]检索(http ://developer.android.com/reference/android/content/Intent.html#getParcelableExtra(java.lang.String中))? (5认同)
  • 当然,它来自我自己的类,它不是标准的android类.我所说的只是用一些常数作为关键! (4认同)
  • 我很久以前就解决了这个问题,但我认为你的答案值得接受. (2认同)

Eri*_*ass 37

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

从您的活动中,您可以通过访问应用程序对象getApplication().

  • 好的,这对我来说是新的.我该如何实现呢? (3认同)
  • @ TenFour04通过清单中的<application android:name ="YourClassName">元素设置它. (2认同)
  • @ TenFour04这是很久以前的事了,我的方法发生了很大的变化.我找到了很多方法.从Singleton对象可以通过类访问器访问的任何东西,以实现Serializable接口.基本上,我没有试图回避这个问题,而是赞同谷歌的方法论.但是,如果有问题的对象需要存在于应用程序范围内,@ Erich的答案是一个很好的解决方案. (2认同)

Sub*_*ian 35

此答案特定于要传递的对象具有嵌套类结构的情况.使用嵌套类结构,使其成为Parcelable或Serializeable有点单调乏味.并且,在Android上序列化对象的过程效率不高.考虑下面的例子,

class Myclass    {
  int a;
  class SubClass    {
       int b;
  }
}
Run Code Online (Sandbox Code Playgroud)

使用Google的GSON库,您可以直接将对象解析为JSON格式的String,并在使用后将其转换回对象格式.例如,

MyClass src = new MyClass();
Gson gS = new Gson();
String target = gS.toJson(src); // Converts the object to a JSON String
Run Code Online (Sandbox Code Playgroud)

现在,您可以将此String作为具有活动意图的StringExtra跨活动传递.

Intent i = new Intent(FromActivity.this, ToActivity.class);
i.putExtra("MyObjectAsString", target);
Run Code Online (Sandbox Code Playgroud)

然后在接收活动中,从字符串表示创建原始对象.

String target = getIntent().getStringExtra("MyObjectAsString");
MyClass src = gS.fromJson(target, MyClass.class); // Converts the JSON String to an Object
Run Code Online (Sandbox Code Playgroud)

它使原始类保持清洁和可重用.最重要的是,如果这些类对象是从Web创建为JSON对象的,那么这个解决方案非常有效且节省时间.

UPDATE


虽然上面解释的方法适用于大多数情况,但出于明显的性能原因,不要依赖Android的捆绑额外系统来传递对象.有许多解决方案使这个过程灵活高效,这里有一些.每个人都有自己的优点和缺点.

  1. Eventbus
  2. 玫瑰油

  • 串行化到GSON是否有效?它足够快吗? (2认同)

Chr*_*art 6

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

public class PersonHelper
{
    public static Person person;
}
Run Code Online (Sandbox Code Playgroud)

我尝试了Parcelable接口路径,但遇到了很多问题,代码中的开销对我来说没什么吸引力.


Cas*_*eyB 5

这取决于您需要访问的数据类型.如果你有某种需要持续存在的数据池,Activity那么Erich的答案是要走的路.如果你只需要将一个对象从一个活动传递给另一个活动,那么你可以让它们实现Serializable并在它们的附加内容中传递它们Intent以启动新的活动Activity.


Fed*_*dor 5

您的对象也可以实现Parcelable接口.然后,您可以使用该Bundle.putParcelable()方法并在intent中的活动之间传递您的对象.

照片流应用程序使用此方法,并且可以被用作参考.