应用升级期间是否清除了Android活动instanceState?

时间:2015-09-14 11:56:52

标签: android serialization instancestate

在活动的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是否在应用程序升级期间清理应用程序的所有instanceState?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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