數據保存與數據恢復

標簽(空格分隔): Android


Activity##

參考博客
activity變得“容易”被系統銷毀時,該activity的onSaveInstanceState就會被執行,除非該activity是被用戶主動銷毀的,例如當用戶按BACK鍵的時候。

只要記住只有用戶主動點擊back鍵或者說主動調用finish()方法時,才不會調用onSaveInstanceState()方法,無論是什么其他的情況都會調用onSaveInstanceState()方法
臨時數據使用 onSaveInstanceState 保存恢復,永久性數據使用 onPause 方法保存。但是onPause方法不能做大量的操作,這會影響下一個Activity入棧。可以坐下簡單的數據庫保存工作,但是不能大量


問題:為什么要選擇在onPause保存永久數據而不是在onStop呢?###

因為論出現怎樣的情況,比如程序突然死亡了,能保證的就是onPause方法是一定會調用的,而onStop和onDestory方法并不一定,所以這個特性使得onPause是持久化相關數據的最后的可靠時機。當然onPause方法不能做大量的操作,這會影響下一個Activity入棧。


當我還沒有自學Android時,玩著一些APP就會產生一個疑問,比如我在一個輸入框中輸入了大量文字沒有提交或者保存。此時來了一個電話,如果退回的時候,輸入框里面的文字消失了,那我可能會砸了電話,所以這個保存數據的操作,是Android開發者做的嗎?
然而是不需要的,因為Android的View本身自己就實現了onSaveInstanceState方法,這些控件自己就具有保存臨時數據和恢復臨時數據的能力。

其他View控件都有相似的實現原理。值得一提的是,只有當你給這個wiget在xml中指定id時,它才具有保存數據并且恢復的能力,并且不同的wiget還不能共用這個id,否則會出現數據覆蓋的情況。

此處輸入圖片的描述
此處輸入圖片的描述

因為vedioView只會保存當前的播放畫面?而不會保存進度數值?


Fragment##

參考博客
跟activity的區別
1、fragment的返回棧只有一個fragment時:
保存臨時數據時,用onSaveInstanceStateS(),保存永久數據時,用onPause()。恢復數據用onCreateView(),而不是用onCreate()喔!
2、fragment的返回棧有多個fragment時:
保存臨時數據時,不能用onSaveInstanceStateS(),而是用onDestoryView(),因為在返回棧有多個fragment時onSaveInstanceStateS()無論怎樣都不會被調用到;保存永久數據時,用onPause()。恢復數據用onCreateView(),而不是用onCreate()喔!
當fragment任務棧中有多個fragment時,進入下一個fragment時,并不會銷毀fragment實例,而是僅僅銷毀視圖,最終調用的方法為onDestoryView。剩下的onDestory與onDetach都不會再執行!!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容