1. 程式人生 > >Android中onSaveInstanceState注意事項

Android中onSaveInstanceState注意事項

1.在一個activity被銷燬前,不一定會呼叫onSaveInstanceState()這個方法,因為不是所有情況都需要去儲存activity的狀態(例如當用戶按回退鍵退出你的activity的時候,因為使用者指定關掉這個activity)。

2.如果這個方法被呼叫,它一定會在 onStop()方法之前,可能會在onPause()方法之前。

3.佈局中的每一個View預設實現了onSaveInstanceState()方法,這樣的話,這個UI的任何改變都會自動的儲存和在activity重新建立的時候自動的恢復。但是這種情況只有在你為這個UI提供了唯一的ID之後才起作用,如果沒有提供ID,將不會儲存它的狀態。

4.由於預設的onSaveInstanceState()方法的實現幫助UI儲存它的狀態,所以如果你需要覆蓋這個方法去儲存額外的狀態資訊時,你應該在執行任何程式碼之前都呼叫父類的onSaveInstanceState()方法(super.onSaveInstanceState())。

5.由於onSaveInstanceState()方法呼叫的不確定性,你應該只使用這個方法去記錄activity的瞬間狀態(UI的狀態)。不應該用這個方法去儲存持久化資料。當用戶離開這個activity的時候應該在onPause()方法中儲存持久化資料(例如應該被儲存到資料庫中的資料)。

6.Activity的 onSaveInstanceState() 和 onRestoreInstanceState()並不是生命週期方法,它們不同於 onCreate()、onPause()等生命週期方法,它們並不一定會被觸發。當應用遇到意外情況(如:記憶體不足、使用者直接按Home鍵)由系統銷燬一個Activity時,onSaveInstanceState() 會被呼叫。但是當用戶主動去銷燬一個Activity時,例如在應用中按返回鍵,onSaveInstanceState()就不會被呼叫。因為在這種情況下,使用者的行為決定了不需要儲存Activity的狀態。通常onSaveInstanceState()只適合用於儲存一些臨時性的狀態,而onPause()適合用於資料的持久化儲存。

  在activity被殺掉之前呼叫儲存每個例項的狀態,以保證該狀態可以在onCreate(Bundle)或者onRestoreInstanceState(Bundle) (傳入的Bundle引數是由onSaveInstanceState封裝好的)中恢復。這個方法在一個activity被殺死前呼叫,當該activity在將來某個時刻回來時可以恢復其先前狀態。

7. 總而言之,onSaveInstanceState()的呼叫遵循一個重要原則,即當系統存在“未經你許可”時銷燬了我們的activity的可能時,則onSaveInstanceState()會被系統呼叫,這是系統的責任,因為它必須要提供一個機會讓你儲存你的資料(當然你不儲存那就隨便你了)。

橫豎屏切換時呼叫順序:

02-17 16:29:25.129 E/MainActivity( 8410): start onSaveInstanceState~~~
02-17 16:29:25.139 E/MainActivity( 8410): start onPause~~~
02-17 16:29:25.139 E/MainActivity( 8410): start onStop~~~
02-17 16:29:25.139 E/MainActivity( 8410): start onDestroy~~~
02-17 16:29:25.169 E/MainActivity( 8410): start onCreate~~~
02-17 16:29:25.189 E/MainActivity( 8410): start onStart~~~
02-17 16:29:25.189 E/MainActivity( 8410): start onRestoreInstanceState~~~
02-17 16:29:25.199 E/MainActivity( 8410): start onResume~~~


Home鍵啟動應用時不會呼叫:
02-17 16:36:32.556: E/MainActivity(8748): start onCreate~~~
02-17 16:36:32.626: E/MainActivity(8748): start onStart~~~
02-17 16:36:32.626: E/MainActivity(8748): start onResume~~~

Home鍵將應用退到後臺時會呼叫:
02-17 16:37:42.204: E/MainActivity(8748): start onSaveInstanceState~~~
02-17 16:37:42.204: E/MainActivity(8748): start onPause~~~
02-17 16:37:42.564: E/MainActivity(8748): start onStop~~~


Back鍵退出應用時不會呼叫:
02-17 16:39:01.702: E/MainActivity(8748): start onPause~~~
02-17 16:39:02.062: E/MainActivity(8748): start onStop~~~
02-17 16:39:02.062: E/MainActivity(8748): start onDestroy~~~


長按HOME鍵,選擇執行其他的程式時。

02-17 16:41:02.850: E/MainActivity(8748): start onSaveInstanceState~~~
02-17 16:41:02.850: E/MainActivity(8748): start onPause~~~
02-17 16:41:02.870: E/MainActivity(8748): start onStop~~~


按下電源按鍵(關閉螢幕顯示)時:

02-17 16:41:29.356: E/MainActivity(8748): start onSaveInstanceState~~~
02-17 16:41:29.356: E/MainActivity(8748): start onPause~~~


從activity A中啟動一個新的activity時:

02-17 16:41:02.850: E/MainActivity(8748): start onSaveInstanceState~~~
02-17 16:41:02.850: E/MainActivity(8748): start onPause~~~
02-17 16:41:02.870: E/MainActivity(8748): start onStop~~~