Activity緩存數(shù)據(jù)信息

一般在一個(gè)App中會(huì)有多個(gè)Activity税手,但Activity跳轉(zhuǎn)的時(shí)候基公,時(shí)間一久,可能系統(tǒng)會(huì)把棧底的Activity回收腰素,這時(shí)候按back聘裁,執(zhí)行的不是原來(lái)Activity的onRestart而是onCreate方法,活動(dòng)被重新創(chuàng)建一次弓千,這時(shí)原先活動(dòng)中的臨時(shí)數(shù)據(jù)和狀態(tài)可能就丟失了衡便。

可以用Activity中的onSaveInstanceState()回調(diào)方法保存臨時(shí)數(shù)據(jù)和狀態(tài),這個(gè)方法一定會(huì)在活動(dòng)被回收之前調(diào)用。方法中有一個(gè)Bundle參數(shù)镣陕,putString()谴餐、putInt()等方法需要傳入兩個(gè)參數(shù),一個(gè)鍵一個(gè)值呆抑。數(shù)據(jù)保存之后會(huì)在onCreate中恢復(fù)岂嗓,onCreate也有一個(gè)Bundle類型的參數(shù)。

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //這里鹊碍,當(dāng)Acivity第一次被創(chuàng)建的時(shí)候?yàn)榭?        //所以我們需要判斷一下
        if( savedInstanceState != null ){
            String str=savedInstanceState.getString("Android");
        }
    }
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("Android","丟失數(shù)據(jù)厌殉。。侈咕。");
    }
一公罕、onSaveInstanceState (Bundle outState)

當(dāng)某個(gè)activity變得“容易”被系統(tǒng)銷毀時(shí),該activity的onSaveInstanceState就會(huì)被執(zhí)行乎完,除非該activity是被用戶主動(dòng)銷毀的熏兄,例如當(dāng)用戶按BACK鍵的時(shí)候。

注意上面的雙引號(hào)树姨,何為“容易”摩桶?言下之意就是該activity還沒(méi)有被銷毀,而僅僅是一種可能性帽揪。這種可能性有哪些硝清?通過(guò)重寫一個(gè)activity的所有生命周期的onXXX方法,包括onSaveInstanceState和onRestoreInstanceState方法转晰,我們可以清楚地知道當(dāng)某個(gè)activity(假定為activity A)顯示在當(dāng)前task的最上層時(shí)芦拿,其onSaveInstanceState方法會(huì)在什么時(shí)候被執(zhí)行,有這么幾種情況:

1查邢、當(dāng)用戶按下HOME鍵時(shí)蔗崎。

這是顯而易見(jiàn)的,系統(tǒng)不知道你按下HOME后要運(yùn)行多少其他的程序扰藕,自然也不知道activity A是否會(huì)被銷毀缓苛,故系統(tǒng)會(huì)調(diào)用onSaveInstanceState,讓用戶有機(jī)會(huì)保存某些非永久性的數(shù)據(jù)邓深。以下幾種情況的分析都遵循該原則

2未桥、長(zhǎng)按HOME鍵,選擇運(yùn)行其他的程序時(shí)芥备。

3冬耿、按下電源按鍵(關(guān)閉屏幕顯示)時(shí)。

4萌壳、從activity A中啟動(dòng)一個(gè)新的activity時(shí)亦镶。

5日月、屏幕方向切換時(shí),例如從豎屏切換到橫屏?xí)r染乌。(如果不指定configchange屬性) 在屏幕切換之前山孔,系統(tǒng)會(huì)銷毀activity A,在屏幕切換之后系統(tǒng)又會(huì)自動(dòng)地創(chuàng)建activity A荷憋,所以onSaveInstanceState一定會(huì)被執(zhí)行

總而言之,onSaveInstanceState的調(diào)用遵循一個(gè)重要原則褐望,即當(dāng)系統(tǒng)“未經(jīng)你許可”時(shí)銷毀了你的activity勒庄,則onSaveInstanceState會(huì)被系統(tǒng)調(diào)用,這是系統(tǒng)的責(zé)任瘫里,因?yàn)樗仨氁峁┮粋€(gè)機(jī)會(huì)讓你保存你的數(shù)據(jù)(當(dāng)然你不保存那就隨便你了)实蔽。另外,需要注意的幾點(diǎn):

  • 布局中的每一個(gè)View默認(rèn)實(shí)現(xiàn)了onSaveInstanceState()方法谨读,這樣的話局装,這個(gè)UI的任何改變都會(huì)自動(dòng)的存儲(chǔ)和在activity重新創(chuàng)建的時(shí)候自動(dòng)的恢復(fù)。但是這種情況只有在你為這個(gè)UI提供了唯一的ID之后才起作用劳殖,如果沒(méi)有提供ID铐尚,將不會(huì)存儲(chǔ)它的狀態(tài)。

  • 由于默認(rèn)的onSaveInstanceState()方法的實(shí)現(xiàn)幫助UI存儲(chǔ)它的狀態(tài)哆姻,所以如果你需要覆蓋這個(gè)方法去存儲(chǔ)額外的狀態(tài)信息時(shí)宣增,你應(yīng)該在執(zhí)行任何代碼之前都調(diào)用父類的onSaveInstanceState()方法(super.onSaveInstanceState())。 既然有現(xiàn)成的可用矛缨,那么我們到底還要不要自己實(shí)現(xiàn)onSaveInstanceState()?這得看情況了爹脾,如果你自己的派生類中有變量影響到UI,或你程序的行為箕昭,當(dāng)然就要把這個(gè)變量也保存了灵妨,那么就需要自己實(shí)現(xiàn),否則就不需要落竹。

  • 由于onSaveInstanceState()方法調(diào)用的不確定性泌霍,你應(yīng)該只使用這個(gè)方法去記錄activity的瞬間狀態(tài)(UI的狀態(tài))。不應(yīng)該用這個(gè)方法去存儲(chǔ)持久化數(shù)據(jù)筋量。當(dāng)用戶離開(kāi)這個(gè)activity的時(shí)候應(yīng)該在onPause()方法中存儲(chǔ)持久化數(shù)據(jù)(例如應(yīng)該被存儲(chǔ)到數(shù)據(jù)庫(kù)中的數(shù)據(jù))烹吵。

  • onSaveInstanceState()如果被調(diào)用,這個(gè)方法會(huì)在onStop()前被觸發(fā)桨武,但系統(tǒng)并不保證是否在onPause()之前或者之后觸發(fā)肋拔。

二、onRestoreInstanceState (Bundle outState)

至于onRestoreInstanceState方法呀酸,需要注意的是凉蜂,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成對(duì)的被調(diào)用的

onRestoreInstanceState被調(diào)用的前提是,activity A“確實(shí)”被系統(tǒng)銷毀了,而如果僅僅是停留在有這種可能性的情況下窿吩,則該方法不會(huì)被調(diào)用茎杂,例如,當(dāng)正在顯示activity A的時(shí)候纫雁,用戶按下HOME鍵回到主界面煌往,然后用戶緊接著又返回到activity A,這種情況下activity A一般不會(huì)因?yàn)閮?nèi)存的原因被系統(tǒng)銷毀轧邪,故activity A的onRestoreInstanceState方法不會(huì)被執(zhí)行

另外刽脖,onRestoreInstanceState的bundle參數(shù)也會(huì)傳遞到onCreate方法中,你也可以選擇在onCreate方法中做數(shù)據(jù)還原忌愚。 還有onRestoreInstanceState在onstart之后執(zhí)行曲管。 至于這兩個(gè)函數(shù)的使用,給出示范代碼(留意自定義代碼在調(diào)用super的前或后):

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
        savedInstanceState.putBoolean("MyBoolean", true);
        savedInstanceState.putDouble("myDouble", 1.9);
        savedInstanceState.putInt("MyInt", 1);
        savedInstanceState.putString("MyString", "Welcome back to Android");
        // etc.
        super.onSaveInstanceState(savedInstanceState);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        boolean myBoolean = savedInstanceState.getBoolean("MyBoolean");
        double myDouble = savedInstanceState.getDouble("myDouble");
        int myInt = savedInstanceState.getInt("MyInt");
        String myString = savedInstanceState.getString("MyString");
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末硕糊,一起剝皮案震驚了整個(gè)濱河市院水,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌简十,老刑警劉巖檬某,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異勺远,居然都是意外死亡橙喘,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門胶逢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)厅瞎,“玉大人,你說(shuō)我怎么就攤上這事初坠『汪ぃ” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵碟刺,是天一觀的道長(zhǎng)锁保。 經(jīng)常有香客問(wèn)我,道長(zhǎng)半沽,這世上最難降的妖魔是什么爽柒? 我笑而不...
    開(kāi)封第一講書人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮者填,結(jié)果婚禮上浩村,老公的妹妹穿的比我還像新娘。我一直安慰自己占哟,他們只是感情好心墅,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布酿矢。 她就那樣靜靜地躺著,像睡著了一般怎燥。 火紅的嫁衣襯著肌膚如雪瘫筐。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 52,337評(píng)論 1 310
  • 那天铐姚,我揣著相機(jī)與錄音策肝,去河邊找鬼。 笑死谦屑,一個(gè)胖子當(dāng)著我的面吹牛驳糯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播氢橙,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼恬偷!你這毒婦竟也來(lái)了悍手?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤袍患,失蹤者是張志新(化名)和其女友劉穎坦康,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诡延,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡滞欠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肆良。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片筛璧。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖惹恃,靈堂內(nèi)的尸體忽然破棺而出夭谤,到底是詐尸還是另有隱情,我是刑警寧澤巫糙,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布朗儒,位于F島的核電站,受9級(jí)特大地震影響参淹,放射性物質(zhì)發(fā)生泄漏醉锄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一浙值、第九天 我趴在偏房一處隱蔽的房頂上張望恳不。 院中可真熱鬧,春花似錦亥鸠、人聲如沸妆够。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)神妹。三九已至颓哮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸵荠,已是汗流浹背冕茅。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛹找,地道東北人姨伤。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像庸疾,于是被迫代替她去往敵國(guó)和親乍楚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

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

  • Activity https://developer.android.com/guide/components/a...
    XLsn0w閱讀 706評(píng)論 0 4
  • 初識(shí)Activity: 我們都知道android中有四大組件(Activity活動(dòng)届慈,Service服務(wù)徒溪,Conte...
    wangling90閱讀 973評(píng)論 2 2
  • 一、Activity創(chuàng)建金顿、啟動(dòng)和關(guān)閉1.創(chuàng)建 Activity2.在清單文件中聲明3.啟動(dòng)4.結(jié)束二臊泌、Activi...
    叛逆的青春不回頭閱讀 662評(píng)論 0 1
  • 這個(gè)暑假有點(diǎn)忙,但也很充實(shí)揍拆,趣配音打擂渠概,新概念單詞學(xué)習(xí),自然拼讀加入升級(jí)版……Tyger老師總是想方設(shè)法的變換學(xué)習(xí)...
    JuanlanG閱讀 1,251評(píng)論 1 2
  • 老吳嫂拴,我要走啦……廈門辦事效率太低啦播揪!… 我來(lái)廈門給一個(gè)兄弟的廣告公司幫忙,還不到2個(gè)月顷牌,就看到很多員工沒(méi)有準(zhǔn)時(shí)交...
    桂花花瓶寶寶閱讀 323評(píng)論 1 0