首页 文章

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

提问于
浏览
121

这个问题在这里已有答案:

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

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

6 回答

  • 35

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

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

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

    Bundle b = this.getIntent().getExtras();
    if (b != null)
        mCurrentListing = b.getParcelable(Constants.CUSTOM_LISTING);
    
  • 37

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

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

  • 5

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

    class Myclass    {
      int a;
      class SubClass    {
           int b;
      }
    }
    

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

    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对象的,那么这个解决方案非常有效且节省时间 .

    UPDATE


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

  • 136

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

    public class PersonHelper
    {
        public static Person person;
    }
    

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

  • 6

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

  • 4

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

    Photostream应用程序使用此方法,可以用作参考 .

相关问题