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

我在这里发布问题我是全新的,不过我已经在这里阅读了很多年。 通常情况下,我总能通过彻底搜索网络find我的答案,但这次我不知所措……

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

问题:在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 CREATOR = new Parcelable.Creator() { public ParcelableTest createFromParcel(Parcel in) { Log.v("ParcelableTest","Creating from parcel"); return new ParcelableTest(in); } public ParcelableTest[] newArray(int size) { return new ParcelableTest[size]; } }; } 

从我的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"); } 

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

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

我在这里想念的是什么?

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

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

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

从技术上讲,文档并未说明从onSaveInstance调用writeToParcelcreateFromParcel 。 事实上,如果你检查代码中的savedState ,你会发现它在保存和恢复情况下都是完全相同的对象实例; 如果可以的话,避免序列化反序列化是有意义的。
OTOH,文档没有说序列化没有完成。 结论应该是你不应该依赖于任何一种情况,只是假设你得到了正确的捆绑。

此外,您可能需要查看http://developer.android.com/guide/topics/resources/runtime-changes.html

我确认了superjos说的话。 在saveToBundle事件中,Android软件包仅存储每个reflection的类成员,而不调用Parcelable函数。 我在这个问题上失去了一天! 伤心….

这真的很糟糕……这意味着你可以用这种方式存储大量的数据。