在应用程序升级期间是否清除了Android活动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?

解决方法

如果有任何机会,这些类将会更改(即使只有dexguard改写名称),您不应该在已保存的instanceState中包含自定义类.系统会保留有关最近活动的一些信息,并可能会尝试在升级之间重用它们.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...