如何在两个Activity之间传递引用(非序列化)?

5

假设我有一个对象的引用,我该如何将它从一个 Activity 传递到另一个 Activity?

我不想查询 Application 对象/单例/静态变量。

这还有可能实现吗?

3个回答

11
您可以在另一个活动中声明一个静态变量,或者在应用程序类中声明一些全局变量,然后在任何活动中访问它,例如您想要解析某个类型为NewType的对象,从OldActivity到NewActivity类。请按照以下步骤进行操作: 在NewActivity.java中声明一个静态NewType对象。
public static NewObject newObject=null;

当您调用NewActivity时,请执行以下操作。

NewActivity.newObject=item;
Intent intent=new Intent(OldActivity.this, NewActivity.class);
startActivity(intent);

嗨,我宁愿不让Activity访问静态变量/应用程序对象。 - kietdlam
如果你想通过Intent传递一些对象,那么你可以使用Bundle,但是要将某个值放入Bundle中,它必须是可包裹的对象,如果不是,则必须另想办法来传递对象,并且由于Android ActivityManager本身调用Activity的构造函数,因此你无法在构造函数中传递参数。我认为没有其他方法了。 - jeet
这不是我想要的答案,但似乎是因为框架不支持我所寻找的行为。谢谢! - kietdlam
1
当您需要使用onSaveInstanceState时,这不是一个解决方案。当您需要使用Bundle时,特别是当应用程序暂停、旋转、阻止手机、切换应用程序等时,无法复制此解决方案。当函数onCreate找不到静态变量时,此解决方案会以异常终止。 - e-info128
1
这难道不会潜在地泄露你的上下文,使其容易出现内存泄漏吗?也就是说,如果对象具有对活动的上下文引用,除非将其设置为null,否则它永远不会被GC清理。 - Arturs Vancans

1

您可以通过以下方式之一来实现:

  • 将对象设置为静态的。(最简单但不总是高效的)
  • 序列化 -> 发送 -> 接收 -> 反序列化。如果您的类不可序列化,也可以使用类似于 JSON编码和解码 的东西。(涉及大量开销,除非您有充分的理由,否则不建议使用)
  • Parcelable(最有效率,最快速)

这里有一个文档示例:您可以使用 parcelable 将对象包装起来,将其附加到意图中,并在接收活动中“解包”它。

 public class MyParcelable implements Parcelable {
     private int mData;

     public int describeContents() {
         return 0;
     }

     public void writeToParcel(Parcel out, int flags) {
         out.writeInt(mData);
     }

     public static final Parcelable.Creator<MyParcelable> CREATOR
             = new Parcelable.Creator<MyParcelable>() {
         public MyParcelable createFromParcel(Parcel in) {
             return new MyParcelable(in);
         }

         public MyParcelable[] newArray(int size) {
             return new MyParcelable[size];
         }
     };

     private MyParcelable(Parcel in) {
         mData = in.readInt();
     }
 }

0

解决方案之一:

您可以创建一个单例类来携带所需的信息

例如:

StorageManager.getInstance().saveSomething(Object obj);

然后使用相应的getter方法检索回来

确保注意同步问题;)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接