Android:从不调用Parcelable.writeToParcel和Parcelable.Creator.createFromParcel

AD-*_*ure 24 java android bundle parcelable

我在这里发布问题我很陌生,但是我已经在这里读了很多年了.通常情况下,我总能通过彻底搜索网络找到我的答案,但这次我不知所措......

在花了一天时间试图弄清楚为什么这不起作用之后我决定寻求帮助,希望你们能给我一些指针,或者更好的解决方案.

问题:在Android游戏中,我已经到了这样的程度,当用户例如按下HOME屏幕按钮时,我必须让应用程序记住它的状态.经过一些搜索后,我意识到为了让我的类在重新打开应用程序后初始化回适当的状态,我必须支持Parcelable接口将它们与Bundle一起传递.

在我的onStop和onStart函数中,我分别保存和恢复Bundle中的游戏状态,但是当我在Bundle上调用putParcelable和getParcelable函数时,永远不会调用对象的writeToParcel和createFromParcel函数.

担心这可能是由于游戏的相对复杂性,我认为我最好创建一个非常简单的应用程序,试图让它工作.

基于我在网上看过的许多Parcelable例子,这成了我的课:

public class ParcelableTest implements Parcelable {
  int id;

  public ParcelableTest(int newID)
  {
    id = newID;
  }

  private ParcelableTest(Parcel in) {
      readFromParcel(in);
  }

  public void writeToParcel(Parcel out, int arg1) {
      writeToParcel(out);
  }

  public void writeToParcel(Parcel out) {
    Log.v("ParcelableTest","Writing to parcel");
      out.writeInt(id);
  }

  public void readFromParcel(Parcel in) {
      id = in.readInt();
  }

  public int describeContents() {
      return 0;
  }

  public static final Parcelable.Creator<ParcelableTest> CREATOR = new
  Parcelable.Creator<ParcelableTest>() {
      public ParcelableTest createFromParcel(Parcel in) {
          Log.v("ParcelableTest","Creating from parcel");
              return new ParcelableTest(in);
      }

      public ParcelableTest[] newArray(int size) {
              return new ParcelableTest[size];
      }
  };
}
Run Code Online (Sandbox Code Playgroud)

从我的Main活动中,我将调用以下函数来保存/恢复数据:

public Bundle saveToBundle(Bundle savedState)
    {
      savedState.putParcelable("Test1",mTest1);
      savedState.putParcelable("Test2",mTest2);
      return savedState;
    }
    public void restoreFromBundle(Bundle savedState)
    {
      mTest1 = savedState.getParcelable("Test1");
      mTest2 = savedState.getParcelable("Test2");

    }
Run Code Online (Sandbox Code Playgroud)

但由于某些原因,这两个函数(使用putParcelable和getParcelable函数)都不会在我的测试类中产生相应的Parcelable调用.

最奇怪的是它确实以某种方式读取了正确的值(我在类中尝试了更多变量),但是我的调试和我的日志显示应用程序永远不会获得writeToParcel和createFromParcel.

我在这里错过了什么?

任何帮助/想法将不胜感激.

sup*_*jos 11

显然,Android Bundle类不遵循在IPC编组期间遵循的parcelable协议.

相反,似乎Bundle实现只是通过反射将Parcelable对象写入其自己的内部映射中.从我们做过的测试来看,Bundle似乎写入/读取Parcelable派生类中定义的每个字段,只是因为你声明了那些字段.

  • 这似乎是正确的,除了活动被销毁的时候,当调用parcelable方法时. (2认同)