? ? ? ? 我們都知道果录,Android app后臺處于后臺時浓体,Activity的onSaveInstanceState? 方法會在 activity上的數(shù)據(jù) 被銷毀之前調(diào)用攒菠,用來保存數(shù)據(jù)和恢復(fù)數(shù)據(jù)的寇僧。一般情況下我們使用Parcelable接口 把需要保存的數(shù)據(jù)序列化亚情,然后再保存妄痪。
? ? ? ? 然而問題就出現(xiàn)了,我們需要啟動Activity势似,并在activity關(guān)閉時返回返回數(shù)據(jù)時拌夏,需要調(diào)用startActivityForResult()方法,傳遞參數(shù)履因。Activity FragmentActivity 和 Fragment 都有這個方法的實現(xiàn)障簿,具體區(qū)別在于回調(diào)的時機不同。假如我們的界面是由幾個Fragment組成的栅迄,我們需要在Fragment中啟動下一個activity并在其結(jié)束的時候產(chǎn)生回調(diào)站故,我們就使用fragment的getActivity()方法獲取FragmentActivity,然后調(diào)用其startactivity()方法毅舆。滿心歡喜的編譯運行西篓,然后。憋活。岂津。。就杯具了悦即。Fragment的onActivityResult方法書中無法獲取結(jié)束回調(diào)吮成,反而Fragment所在activity獲取了結(jié)束回掉橱乱。好吧,使用Fragment 啟動吧粱甫,ok ,nice泳叠。這下可沒問題了吧。
? ? ? ? 上面的都是前提條件茶宵,重點現(xiàn)在才開始了传于。新啟動的activity匙瘪,我們使用onSaveInstanceState 保存了序列化數(shù)據(jù)時就出現(xiàn)問題了维费。只能保存一個對象左痢,保存2個及以上在數(shù)據(jù)恢復(fù)的時候就會一直報
java.lang.RuntimeException: Parcel android.os.Parcel@5d9dfa6: Unmarshalling unknown type code xxxx at offset xxxx
這個錯誤,感覺像是Android 的bug吧安拟,也可能系統(tǒng)在恢復(fù)處理Fragment和Activity恢復(fù)數(shù)據(jù)時有所區(qū)別蛤吓。
? ? ? ? 解決辦法:①使用Activity啟動宵喂,回調(diào)是調(diào)用Fragment 相應(yīng)需要回調(diào)的方法糠赦。②使用Fragment啟動時,跳過系統(tǒng)的保存數(shù)據(jù)方法锅棕,自己寫本地文件保存和恢復(fù)數(shù)據(jù)拙泽。
? ? ? 小結(jié),關(guān)于Parcelable 序列化的使用裸燎,onSaveInstanceState的調(diào)用時機顾瞻,startActivityForResult和onActivityResult的使用,這里就不再簡述了德绿,如果不懂找度娘吧荷荤,到處都是相關(guān)文章。只是自己在開發(fā)中移稳,遇到這個奇葩問題蕴纳,自己在網(wǎng)上找解決資料的時候,幾乎沒有相關(guān)資料个粱」琶花費好長時間,終于找到問題所在都许。以及有一個對應(yīng)的解決方案了稻薇。當然如果哪位大神知道問什么是這種情況,歡迎留言胶征,受教了塞椎,thanks!!!