我要做 Android 之 Activity 2

我要做 Android 第二彈

大家好夏块,這里是我要做 Android 的第二彈疏咐,說實話纤掸,大四了在學(xué)校上課都沒什么心情了。真的是有些焦慮了浑塞,要不是最近在跟著老師做項目借跪,我覺得我就要進入瘋狂找工作模式了。我一直想從事 Android 開發(fā)工作酌壕,這個目標在大二的時候就決定了掏愁。我愿一往無前。不過看了面試題目我決定還是先復(fù)(預(yù))習(xí)吧卵牍。果港。。

話不多說糊昙,開干:

今天我們說 Activity 的 onSaveInstanceState() 和 onRestoreInstanceState() 方法辛掠。我在我的上一篇文章中已經(jīng)詳細的介紹了有關(guān) Activity 的生命周期和方法,如果想了解的可以去看看這篇文章:http://www.reibang.com/p/e246d20f5dd9溅蛉。所以我們可以明確這兩個方法不是生命周期的方法公浪,這是什么意思。

其實在activity的一個生命周期中船侧,onSaveInstanceState() 你不一定能遇得到欠气。

正如官網(wǎng)對該方法的解釋所說:“This method is called before an activity may be killed so that when it comes back some time in the future it can restore its state. ” 在“可能被系統(tǒng)殺死”之前調(diào)用。說的很準確啊镜撩,先明白一點:如果一個 activityA 不可能在后臺被系統(tǒng)主動kill掉预柒,那么就不會調(diào)用該方法

那么回過頭,什么時候activity“可能被系統(tǒng)殺死”呢袁梗?官網(wǎng)也是有明確說明的:

總結(jié)說就是:

onResume() 不會被殺宜鸯。前臺應(yīng)用,系統(tǒng)是不會主動 kill 的遮怜。(廢話淋袖,不能見誰都 kill 吧是吧,你以為你是社會我龍哥嗎锯梁。即碗。。)

onPause() HONEYCOMB(android3.0)之前陌凳,可能被殺剥懒;3.0之后不會被殺。

onStop() 可能被殺合敦。(俗話說見面三分情初橘,我都看不見你了那就管不了這么多了是吧)

明確activity可能在生命周期中被殺的方法之后,根據(jù)上邊說明便可知:

android3.0之前:onResume() -- [optional] onSaveInstanceState() -- onPause(),即調(diào)用onPause()之前,可能調(diào)用 onSaveInstanceState()

android3.0之后:onResume() -- onPause() -- [optional] onSaveInstanceState() -- onStop(), 即調(diào)用onStop()之前保檐,可能調(diào)用 onSaveInstanceState()

如上邊特意提到一樣耕蝉,這里仍要注意“可能”,如果一個 activityA 不可能在后臺被系統(tǒng)主動 kill 掉夜只,那么就不會調(diào)用該方法赔硫。

比如以下邏輯:

activityA.startActivity(activityB)

activityA.finish()

A啟動了B,但是A自己把自己 finish 了盐肃,也就是說系統(tǒng)不可能主動 kill activityA 了爪膊,因此雖然 A 的 onPause()、onStop() 被調(diào)用砸王,但 onSaveInstanceState() 方法也是不會調(diào)用到的推盛。

那么同理,默認情況下在一個activity中谦铃,返回退出也是不會調(diào)用 onSaveInstanceState() 的耘成。(系統(tǒng)表示這個鍋我不背,都是用戶的錯驹闰,誰知道用戶會這樣操作是吧瘪菌。。嘹朗。)

所以總結(jié)下大致的常見的幾種情況:

1师妙、當用戶按下HOME鍵時。

這是顯而易見的屹培,系統(tǒng)不知道你按下 HOME 后要運行多少其他的程序默穴,自然也不知道 activityA 是否會被銷毀,所以系統(tǒng)會調(diào)用 onSaveInstanceState褪秀,讓用戶有機會保存某些非永久性的數(shù)據(jù)蓄诽。以下幾種情況的分析都遵循該原則

2、長按HOME鍵媒吗,選擇運行其他的程序時仑氛。

3、按下電源按鍵(關(guān)閉屏幕顯示)時闸英。

4锯岖、從activity A中啟動一個新的 activity 時。

5自阱、屏幕方向切換時嚎莉,例如從豎屏切換到橫屏?xí)r米酬。

在屏幕切換之前沛豌,系統(tǒng)會銷毀 activity A,在屏幕切換之后系統(tǒng)又會自動地創(chuàng)建 activity A,所以onSaveInstanceState 一定會被執(zhí)行加派。這個在 Android開發(fā)藝術(shù)探索 里介紹的比較詳細叫确。而且還有 demo(可以想一下如果不是系統(tǒng)給我們保存了信息為啥你旋轉(zhuǎn)屏幕后還會出現(xiàn)之前你在看的界面和你正在編輯的未完成的信息呢是吧。 系統(tǒng):這都是我做的芍锦,厲不厲害竹勉,沒我不行吧。娄琉。次乓。所以不要肆意(操)玩(做)弄我。孽水。)

總而言之票腰,onSaveInstanceState 的調(diào)用遵循一個重要原則,即當系統(tǒng) “未經(jīng)你許可” 時銷毀了你的activity女气,則onSaveInstanceState 會被系統(tǒng)調(diào)用杏慰,這是系統(tǒng)的責(zé)任,因為它必須要提供一個機會讓你保存你的數(shù)據(jù)(當然你不保存那就隨便你了)炼鞠。 ———劃重點劃重點劃重點 缘滥。。

Q:onSaveInstanceState() 與 onPause() 的區(qū)別谒主?

有時候會出現(xiàn)這樣的問題朝扼,童鞋們還記得我開頭咋說的嘛,onPause 是在 Activity 不可見的時候調(diào)用霎肯,一般之后就會調(diào)用 onStop 方法吟税,這是生命周期方法。就像人都會經(jīng)過 幼兒 -- 少年 -- 青少年 -- 成年 -- 老年 -- 死亡 一樣姿现,躲不開的肠仪。但 onSaveInstanceState 方法不一樣,它是由系統(tǒng)調(diào)用而不是程序員們調(diào)用备典。具體的發(fā)生時機也不能確定异旧。作用是保存實例狀態(tài),相信我在上面已經(jīng)介紹的很詳細了提佣。

系統(tǒng)異常終止時吮蛹,調(diào)用onSavaInstanceState來保存狀態(tài)。該方法調(diào)用在onStop之前拌屏,但和onPause沒有時序關(guān)系潮针。

onSaveInstanceState 與 onPause 的區(qū)別: 前者適用于對臨時性狀態(tài)的保存,而后者適用于對數(shù)據(jù)的持久化保存倚喂。

Activity被重新創(chuàng)建時每篷,調(diào)用 onRestoreInstanceState(該方法在 onStart 之后)瓣戚,并將onSavaInstanceState保存的Bundle對象作為參數(shù)傳到 onRestoreInstanceState 與onCreate 方法。

可通過 onRestoreInstanceState(Bundle savedInstanceState) 和 onCreate((Bundle savedInstanceState) 來判斷Activity是否被重建焦读,并取出數(shù)據(jù)進行恢復(fù)子库。但需要注意的是,在 onCreate 取出數(shù)據(jù)時一定要先判斷 savedInstanceState 是否為空矗晃。另外仑嗅,谷歌更推薦使用 onRestoreInstanceState 進行數(shù)據(jù)恢復(fù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末张症,一起剝皮案震驚了整個濱河市仓技,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌俗他,老刑警劉巖浑彰,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拯辙,居然都是意外死亡郭变,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門涯保,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诉濒,“玉大人,你說我怎么就攤上這事夕春∥椿模” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵及志,是天一觀的道長片排。 經(jīng)常有香客問我,道長速侈,這世上最難降的妖魔是什么率寡? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮倚搬,結(jié)果婚禮上冶共,老公的妹妹穿的比我還像新娘。我一直安慰自己每界,他們只是感情好捅僵,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著眨层,像睡著了一般庙楚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上趴樱,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天馒闷,我揣著相機與錄音酪捡,去河邊找鬼。 笑死窜司,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的航揉。 我是一名探鬼主播塞祈,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼帅涂!你這毒婦竟也來了议薪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤媳友,失蹤者是張志新(化名)和其女友劉穎斯议,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體醇锚,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡哼御,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了焊唬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恋昼。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖赶促,靈堂內(nèi)的尸體忽然破棺而出液肌,到底是詐尸還是另有隱情,我是刑警寧澤鸥滨,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布嗦哆,位于F島的核電站,受9級特大地震影響婿滓,放射性物質(zhì)發(fā)生泄漏老速。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一凸主、第九天 我趴在偏房一處隱蔽的房頂上張望烁峭。 院中可真熱鬧,春花似錦秕铛、人聲如沸约郁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鬓梅。三九已至,卻和暖如春谨湘,著一層夾襖步出監(jiān)牢的瞬間绽快,已是汗流浹背芥丧。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留坊罢,地道東北人续担。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像活孩,于是被迫代替她去往敵國和親物遇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354