? ? ? ? 我們都知道,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!!!