* <ul> * <li> {@link #onCreate} is where you initialize your activity. Most * importantly, here you will usually call {@link #setContentView(int)} * with a layout resource defining your UI, and using {@link #findViewById} * to retrieve the widgets in that UI that you need to interact with * programmatically.
onCreate是初始化你的Activity,在這里你可以調用setContentView(int)與layout資源來定義你的UI界面。使用findViewById來取出您交互的控件
* <li> {@link #onPause} is where you deal with the user leaving your * activity. Most importantly, any changes made by the user should at this * point be committed (usually to the * {@link android.content.ContentProvider} holding the data). * </ul>
這句的意思是說,onPause是處理用戶離開時的方法。最重要的,任何用戶操作產生的數據應該在這里進行提交,使用android.content.ContentProvider}來保存數據。
Because of this, you should use the onPause method to write any persistent data (such as user edits) to storage. In addition, the method onSaveInstanceState(Bundle) is called before placing the activity in such a background state, allowing you to save away any dynamic instance state in your activity into the given Bundle, to be later received in onCreate if the activity needs to be re-created. See the Process Lifecycle section for more information on how the lifecycle of a process is tied to the activities it is hosting. Note that it is important to save persistent data in onPause instead of onSaveInstanceState because the later is not part of the lifecycle callbacks, so will not be called in every situation as described in its documentation.
我們可以使用onSaveInstanceState(Bundle)方法進行存儲,然后onRestoreInstanceState 處進行處理,即拿到值。
如何使用
onSaveInstanceState(Bundle)方法?


// 將數據保存到savedInstanceState對象中, 該對象會在重建activity時傳遞給onCreate方法 @Override protected void onSaveInstanceState(Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); }
這種方式可以在旋轉的時候進行數據保存,但是使用Actionbar向上跳不行,原因是:
* <p>Do not confuse this method with activity lifecycle callbacks such as * {@link #onPause}, which is always called when an activity is being placed * in the background or on its way to destruction, or {@link #onStop} which * is called before destruction. One example of when {@link #onPause} and * {@link #onStop} is called and not this method is when a user navigates back * from activity B to activity A: there is no need to call {@link #onSaveInstanceState} * on B because that particular instance will never be restored, so the * system avoids calling it. An example when {@link #onPause} is called and * not {@link #onSaveInstanceState} is when activity B is launched in front of activity A: * the system may avoid calling {@link #onSaveInstanceState} on activity A if it isn't * killed during the lifetime of B since the state of the user interface of * A will stay intact.
不要將這個方法和activity生命周期回調如onPause()或onStop()搞混淆了,onPause()在activtiy被放置到背景或者自行銷毀時總會被調用,onStop()在activity被銷毀時被調用。一個會調用onPause()和onStop(),但不觸發onSaveInstanceState的例子是當用戶從activity B返回到activity A時:沒有必要調用B的onSaveInstanceState(Bundle),此時的B實例永遠不會被恢復,因此系統會避免調用它。一個調用onPause()但不調用onSaveInstanceState的例子是當activity B啟動並處在activity A的前端:如果在B的整個生命周期里A的用戶界面狀態都沒有被破壞的話,系統是不會調用activity A的onSaveInstanceState(Bundle)的。(http://blog.csdn.net/ddna/article/details/5123482)
(1)、當用戶按下HOME鍵時。
這是顯而易見的,系統不知道你按下HOME后要運行多少其他的程序,自然也不知道activity A是否會被銷毀,因此系統會調用onSaveInstanceState(),讓用戶有機會保存某些非永久性的數據。以下幾種情況的分析都遵循該原則
(2)、長按HOME鍵,選擇運行其他的程序時。
(3)、按下電源按鍵(關閉屏幕顯示)時。
(4)、從activity A中啟動一個新的activity時。
(5)、屏幕方向切換時,例如從豎屏切換到橫屏時。
在屏幕切換之前,系統會銷毀activity A,在屏幕切換之后系統又會自動地創建activity A,所以onSaveInstanceState()一定會被執行,且也一定會執行onRestoreInstanceState()。
特別說明
如果我們沒覆寫onSaveInstanceState()方法,此方法會默認自動保存Activity中的某些數據,比如UI控件的狀態和值,前提是需要指定控件一個唯一的ID,否則控件的數據不會出現保存。
那么什么時候保存覆寫這個方法?
如果需要保存額外的數據時, 就需要覆寫onSaveInstanceState()方法。大家需要注意的是:onSaveInstanceState()方法只適合保存瞬態數據, 比如UI控件的狀態, 成員變量的值等,而不應該用來保存持久化數據,持久化數據應該當用戶離開當前的 activity時,在 onPause() 中保存(比如將數據保存到數據庫或文件中)。說到這里,還要說一點的就是在onPause()中不適合用來保存比較費時的數據,所以這點要理解。
至於onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成對的被調用的,onRestoreInstanceState被調用的前提是,activity A“確實”被系統銷毀了,而如果僅僅是停留在有這種可能性的情況下,則該方法不會被調用,例如,當正在顯示activity A的時候,用戶按下HOME鍵回到主界面,然后用戶緊接着又返回到activity A,這種情況下activity A一般不會因為內存的原因被系統銷毀,故activity A的onRestoreInstanceState方法不會被執行
到此我們解決我們的問題: