onsaveinstancestate 怎麼使用

1 The system calls this method before making the activity vulnerable to being destroyed and passes it a Bundle object. The Bundle is where you can store state information about the activity as name-value pairs, using methods such as putString(). Then, if the system kills your activity's process and the user navigates back to your activity, the system passes the Bundle to onCreate() so you can restore the activity state you saved during onSaveInstanceState(). If there is no state information to restore, then the Bundle passed to onCreate()is null.

一般onSaveInstanceState(Bundle ) 和 onCreate(Bundle ) 結合使用來保存activity的狀態,但是文檔裡面指出了幾個問題:系 統不會保證onSaveInstanceState()在activity被銷毀前總被調用(因為有一些不需要保存狀態的情況,比如,用戶用BACK鍵關 閉此activity);如果onSaveInstanceState()被調用,那麼一定是在onStop()之前,或者可能在onPause()之 前。

2 如果你在onSaveInstanceState()不做啥事(不重載它),有些activity的狀態也會被activity默認的 onSaveInstanceState()保存。比如,通常EditText會保存自己的狀態,原因就是activity默認的 onSaveInstanceState()會調用其layout裡面每一個View的onSaveInstanceState(),當然也包括此 EditView。你只需要為這些view提供唯一的ID(android:id屬性),他們就會保存自己的狀態,不用你操心了。這個自動保存可以通過 android:saveEnabled屬性或者 setSaveEnabled()方法 來禁用。

3 「onSaveInstanceState() 只應該被用來保存activity暫時的狀態(例如,類成員變量的值關聯著UI),而不應該用來保存持久化數據。持久化數據應該當用戶離開當前的 activity時,在 onPause() 中保存(比如,保存到資料庫)。」  這裡用onPause()令我不理解,因為文檔前面提過,onPause()時,activity並沒有完全看不到,而只是可能有個dialog蓋住 它,所以不建議在onPause()中做耗時的工作。(這裡我只能將寫入資料庫理解為輕量級操作了。。。。暫時我覺得持久化數據應該在 onDestroy()中做)。

4 可以用旋轉螢幕來測試你的程序保存狀態的能力。因為一般旋轉時,activity會被重新 onCreate() onStart()等等,程序此時能夠保存狀態是很重要的。

本文內容整理自網絡, 文中所有觀點看法不代表淘大白的立場