Android官方开发文档Training系列课程中文版:管理Activity的生命周期之Activity的重建
原文地址:http://android.xsoftlab.net/training/basics/activity-lifecycle/recreating.html#RestoreState
有這么幾個關于activity通過正常渠道銷毀的場景,比如用戶按下了返回按鈕,又或者是在activity中調用了終止信號finish。系統可能也會在activity在停止狀態時銷毀它,也可能會在長時間不使用的時候銷毀它,也可能會當前臺activity需要更多資源時,系統必須關掉后臺進行來恢復內存時銷毀它。
當activity因為用戶按下了返回按鈕或者是自己關閉而被銷毀的話,系統會認為activity的實例是永遠消失了,因為習慣上會認為activity已經不再需要了。然而,如果activity是因為系統資源枯竭而被銷毀的話,盡管activity的實例已經被銷毀了,系統會記得它存在過,以便用戶在返回的時候系統可以創建一個新的activity實例,并且通過上一個activity銷毀時保存的一系列數據來恢復當時的狀態。系統恢復原先的狀態時通過一個名為instance state的對象存儲的數據,它是一個Bundle對象,并以鍵值對的方式存儲數據的集合。
警告:在每次用戶旋轉屏幕的時候,activity會被銷毀并重新創建。當屏幕改變的方向,系統會銷毀并重新創建當前的activity,因為屏幕的配置發生了改變,activity可能需要加載更改后的資源(比如說布局)。
默認情況下,系統使用Bundle對象存儲activity不居中每一個View對象的信息(比如說在EditText中輸入的內容)。所以如果activity對象被銷毀然后重新創建了的話,可以不必再寫多少代碼就可以恢復布局的狀態到原來的狀態。然而,activity可能有更多的狀態信息需要恢復,比如activity中記錄用戶進度的成員變量。
Note:為了使Android系統可以保存activity中view的狀態,每一個VIEW必須擁有唯一的ID,支持android:id屬性。
為了保存activity狀態的附加數據,你必須重寫onSaveInstanceState方法。系統會在用戶離開的時候調用這個方法,并且會傳回一個Bundle對象,這個對象可以用來在activity意外被銷毀的事件中保存下來。如果系統稍后必須創建activity實例,系統會通過onRestoreInstanceState方法和onCreate方法傳遞相同的Bundle對象。
隨著系統開始停止activity,它會調用onSaveInstanceState(1),所以你可以指定一些在稍后恢復的時候所需要的附加狀態數據。如果activity銷毀了,然后一個相同的實例必須重新創建,那么系統會通過onCreate方法(2)和onRestoreInstanceState(3)方法將默認的狀態數據傳遞回來。
存儲Activity的狀態
隨著activity開始進入停止狀態,系統會調用onSaveInstanceState方法,所以activity可以存儲一系列的狀態信息。這個方法的默認實現是保存了一些與activity的view層級相關額信息,比如在EditText空間中的內容,又或者是ListView的滑動位置。
為了保存activity的附加狀態信息,必須實現onSaveInstanceState方法然后添加鍵值對到Bundle對象中:
static final String STATE_SCORE = "playerScore"; static final String STATE_LEVEL = "playerLevel"; ... @Override public void onSaveInstanceState(Bundle savedInstanceState) {// Save the user's current game statesavedInstanceState.putInt(STATE_SCORE, mCurrentScore);savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);// Always call the superclass so it can save the view hierarchy statesuper.onSaveInstanceState(savedInstanceState); }警告:因為總是調用了onSaveInstanceState的父類實現,所以默認實現可以保存view層級的狀態。
恢復Activity的狀態
如果之前的activity銷毀了之后又重新創建了,可以通過Bundle對象恢復保存的狀態。onCreate方法和onSaveInstanceState方法都會將相同的Bundle對象通過參數回調回來。
因為onCreate方法在系統創建新實例的時候會調用,你必須在嘗試訪問它之前檢查Bundle對象是否為null,如果是null,那說明系統創建了一個新的activity對象,否則就是原來的那個對象被銷毀了這里又重新創建了一個。
以下是如何在onCreate方法中恢復一些狀態數據的例子:
@Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); // Always call the superclass first// Check whether we're recreating a previously destroyed instanceif (savedInstanceState != null) {// Restore value of members from saved statemCurrentScore = savedInstanceState.getInt(STATE_SCORE);mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);} else {// Probably initialize members with default values for a new instance}... }除了onCreate方法可以恢復狀態之外,onRestoreInstanceState()方法同樣也可以實現該功能,該方法會在onStart方法之后調用,不過僅僅是在保存了數據之后才會調用,所以你不需要去做Bundle對象是否為null的檢查:
public void onRestoreInstanceState(Bundle savedInstanceState) {// Always call the superclass so it can restore the view hierarchysuper.onRestoreInstanceState(savedInstanceState);// Restore state members from saved instancemCurrentScore = savedInstanceState.getInt(STATE_SCORE);mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); }警告:因為總是調用了onRestoreInstanceState()的父類實現,所以默認實現可以恢復view層級的狀態。
有關更多因為在運行時的重啟事件而造成的activity重新創建(比如屏幕旋轉)的信息,請參見Handling Runtime Changes。
總結
以上是生活随笔為你收集整理的Android官方开发文档Training系列课程中文版:管理Activity的生命周期之Activity的重建的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 提供一个Android原生的Progre
- 下一篇: JAVA1.6实现动态编译加载运行