我们都知道,Android app后台处于后台时,Activity的onSaveInstanceState 方法会在 activity上的数据 被销毁之前调用,用来保存数据和恢复数据的。一般情况下我们使用Parcelable接口 把需要保存的数据序列化,然后再保存。
然而问题就出现了,我们需要启动Activity,并在activity关闭时返回返回数据时,需要调用startActivityForResult()方法,传递参数。Activity FragmentActivity 和 Fragment 都有这个方法的实现,具体区别在于回调的时机不同。假如我们的界面是由几个Fragment组成的,我们需要在Fragment中启动下一个activity并在其结束的时候产生回调,我们就使用fragment的getActivity()方法获取FragmentActivity,然后调用其startactivity()方法。满心欢喜的编译运行,然后。。。。就杯具了。Fragment的onActivityResult方法书中无法获取结束回调,反而Fragment所在activity获取了结束回掉。好吧,使用Fragment 启动吧,ok ,nice。这下可没问题了吧。
上面的都是前提条件,重点现在才开始了。新启动的activity,我们使用onSaveInstanceState 保存了序列化数据时就出现问题了。只能保存一个对象,保存2个及以上在数据恢复的时候就会一直报
java.lang.RuntimeException: Parcel android.os.Parcel@5d9dfa6: Unmarshalling unknown type code xxxx at offset xxxx
这个错误,感觉像是Android 的bug吧,也可能系统在恢复处理Fragment和Activity恢复数据时有所区别。
解决办法:①使用Activity启动,回调是调用Fragment 相应需要回调的方法。②使用Fragment启动时,跳过系统的保存数据方法,自己写本地文件保存和恢复数据。
小结,关于Parcelable 序列化的使用,onSaveInstanceState的调用时机,startActivityForResult和onActivityResult的使用,这里就不再简述了,如果不懂找度娘吧,到处都是相关文章。只是自己在开发中,遇到这个奇葩问题,自己在网上找解决资料的时候,几乎没有相关资料。花费好长时间,终于找到问题所在。以及有一个对应的解决方案了。当然如果哪位大神知道问什么是这种情况,欢迎留言,受教了,thanks!!!