android筆記--保存和恢復activity的狀態(tài)數(shù)據(jù)

一般來說, 調(diào)用onPause()和onStop()方法后的activity實例仍然存在于內(nèi)存中, activity的所有信息和狀態(tài)數(shù)據(jù)不會消失, 當activity重新回到前臺之后, 所有的改變都會得到保留. 但是當系統(tǒng)內(nèi)存不足時, 調(diào)用onPause()和onStop()方法后的activity可能會被系統(tǒng)摧毀, 此時內(nèi)存中就不會存有該activity的實例對象了. 如果之后這個activity重新回到前臺, 之前所作的改變就會消失. 為了避免此種情況的發(fā)生, 開發(fā)者可以覆寫onSaveInstanceState()方法. onSaveInstanceState()方法接受一個Bundle類型的參數(shù), 開發(fā)者可以將狀態(tài)數(shù)據(jù)存儲到這個Bundle對象中, 這樣即使activity被系統(tǒng)摧毀, 當用戶重新啟動這個activity而調(diào)用它的onCreate()方法時, 上述的Bundle對象會作為實參傳遞給onCreate()方法, 開發(fā)者可以從Bundle對象中取出保存的數(shù)據(jù), 然后利用這些數(shù)據(jù)將activity恢復到被摧毀之前的狀態(tài).

示例:

public class MainActivity extends Activity
{
public static final int SECOND_ACTIVITY = 0;
private String temp;

@Override  
public void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    // 從savedInstanceState中恢復數(shù)據(jù), 如果沒有數(shù)據(jù)需要恢復savedInstanceState為null  
    if (savedInstanceState != null) {  
        temp = savedInstanceState.getString("temp");  
        System.out.println("onCreate: temp = " + temp);  
    }  
}  

public void onResume() {  
    super.onResume();  
    temp = "xing";  
    System.out.println("onResume: temp = " + temp);  
    // 切換屏幕方向會導致activity的摧毀和重建  
    if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) {  
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);  
        System.out.println("屏幕切換");  
    }  
}  

// 將數(shù)據(jù)保存到outState對象中, 該對象會在重建activity時傳遞給onCreate方法  
@Override  
protected void onSaveInstanceState(Bundle outState) {  
    super.onSaveInstanceState(outState);  
    outState.putString("temp", temp);  
}  

}

需要注意的是, onSaveInstanceState()方法并不是一定會被調(diào)用的, 因為有些場景是不需要保存狀態(tài)數(shù)據(jù)的. 比如用戶按下BACK鍵退出activity時, 用戶顯然想要關閉這個activity, 此時是沒有必要保存數(shù)據(jù)以供下次恢復的, 也就是onSaveInstanceState()方法不會被調(diào)用. 如果調(diào)用onSaveInstanceState()方法, 調(diào)用將發(fā)生在onPause()或onStop()方法之前.
onSaveInstanceState()方法的默認實現(xiàn) 如果開發(fā)者沒有覆寫onSaveInstanceState()方法, 此方法的默認實現(xiàn)會自動保存activity中的某些狀態(tài)數(shù)據(jù), 比如activity中各種UI控件的狀態(tài). android應用框架中定義的幾乎所有UI控件都恰當?shù)膶崿F(xiàn)了onSaveInstanceState()方法, 因此當activity被摧毀和重建時, 這些UI控件會自動保存和恢復狀態(tài)數(shù)據(jù). 比如EditText控件會自動保存和恢復輸入的數(shù)據(jù), 而CheckBox控件會自動保存和恢復選中狀態(tài). 開發(fā)者只需要為這些控件指定一個唯一的ID(通過設置android:id屬性即可), 剩余的事情就可以自動完成了. 如果沒有為控件指定ID, 則這個控件就不會進行自動的數(shù)據(jù)保存和恢復操作. 由上所述, 如果開發(fā)者需要覆寫onSaveInstanceState()方法, 一般會在第一行代碼中調(diào)用該方法的默認實現(xiàn): super.onSaveInstanceState(outState).
是否需要覆寫onSaveInstanceState()方法 既然該方法的默認實現(xiàn)可以自動的保存UI控件的狀態(tài)數(shù)據(jù), 那什么時候需要覆寫該方法呢? 如果需要保存額外的數(shù)據(jù)時, 就需要覆寫onSaveInstanceState()方法. 如需要保存類中成員變量的值(見上例).
onSaveInstanceState()方法適合保存什么數(shù)據(jù) 由于onSaveInstanceState()方法方法不一定會被調(diào)用, 因此不適合在該方法中保存持久化數(shù)據(jù), 例如向數(shù)據(jù)庫中插入記錄等. 保存持久化數(shù)據(jù)的操作應該放在onPause()中. onSaveInstanceState()方法只適合保存瞬態(tài)數(shù)據(jù), 比如UI控件的狀態(tài), 成員變量的值等.
引發(fā)activity摧毀和重建的其他情形 除了系統(tǒng)處于內(nèi)存不足的原因會摧毀activity之外, 某些系統(tǒng)設置的改變也會導致activity的摧毀和重建. 例如改變屏幕方向(見上例), 改變設備語言設定, 鍵盤彈出等.

原:http://bbs.51cto.com/thread-1009851-1.html

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宿礁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子咨堤,更是在濱河造成了極大的恐慌柜思,老刑警劉巖棠隐,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件愉棱,死亡現(xiàn)場離奇詭異盾舌,居然都是意外死亡走趋,警方通過查閱死者的電腦和手機沐旨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門森逮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人磁携,你說我怎么就攤上這事褒侧。” “怎么了谊迄?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵闷供,是天一觀的道長。 經(jīng)常有香客問我统诺,道長歪脏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任粮呢,我火速辦了婚禮婿失,結果婚禮上钞艇,老公的妹妹穿的比我還像新娘。我一直安慰自己豪硅,他們只是感情好哩照,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著舟误,像睡著了一般葡秒。 火紅的嫁衣襯著肌膚如雪姻乓。 梳的紋絲不亂的頭發(fā)上嵌溢,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機與錄音蹋岩,去河邊找鬼赖草。 笑死,一個胖子當著我的面吹牛剪个,可吹牛的內(nèi)容都是我干的秧骑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼扣囊,長吁一口氣:“原來是場噩夢啊……” “哼乎折!你這毒婦竟也來了?” 一聲冷哼從身側響起侵歇,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤骂澄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后惕虑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坟冲,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年溃蔫,在試婚紗的時候發(fā)現(xiàn)自己被綠了健提。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡伟叛,死狀恐怖私痹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情统刮,我是刑警寧澤侄榴,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站网沾,受9級特大地震影響癞蚕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辉哥,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一桦山、第九天 我趴在偏房一處隱蔽的房頂上張望攒射。 院中可真熱鬧,春花似錦恒水、人聲如沸会放。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咧最。三九已至,卻和暖如春御雕,著一層夾襖步出監(jiān)牢的瞬間矢沿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工酸纲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留捣鲸,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓闽坡,卻偏偏與公主長得像栽惶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子疾嗅,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容