9

在活动的 instanceState 中,我们存储了一个 Serializable (bundle.putSerializable)。在来自 Play 商店的崩溃报告中,我们看到了以下堆栈跟踪:

Caused by: java.lang.ClassNotFoundException: o.ণ
at java.lang.Class.classForName(Class.java)
at java.lang.Class.forName(Class.java:308)
at android.os.Parcel$2.resolveClass(Parcel.java:2373)
at java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1641)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:657)
at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1782)
at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:761)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1983)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1940)
at android.os.Parcel.readSerializable(Parcel.java:2381)

我们的代码被 DexGuard 混淆了。看起来Android能够序列化类但不能反序列化类。

我们目前能想到的唯一原因是应用程序的升级(通过 de Play 商店)。在版本之间,类发生了变化(因为 Dexguard),使得反序列化变得不可能。

所以,我的问题是:Android 在升级应用程序期间是否清除应用程序的所有实例状态?

4

2 回答 2

1

据我所知,系统在 Activity 完全销毁时恢复其状态的唯一条件是系统必须销毁该 Activity 以恢复系统内存。在所有其他情况下(强制停止进程、重新安装应用程序、重新启动设备),状态将丢失。

关于重装,你必须考虑到,当你安装新版本的应用程序时,你可能已经更改或删除了一个或多个活动,并且旧活动的状态可能无法匹配新活动的状态。例如,假设在单个 Activity 应用程序中,您有一个 ID 为“@+id/my_text”的 TextView。几天后,您决定删除 TextView 并将 ID“my_text”分配给另一个 View - 例如 Spinner:系统如何在 Spinner 中恢复 TextView 的文本?

于 2015-09-18T09:15:04.947 回答
1

如果这些类有可能发生变化(即使只是 DexGuard 改组名称),则不应在保存的 instanceState 中包含自定义类。系统会保留一些有关最近活动的信息,并且可能会尝试在升级中重复使用这些信息。

于 2015-09-23T11:46:20.180 回答