Android啟動(dòng)模式完全解析(上)

1. 基本介紹

大家平時(shí)只要懂一點(diǎn)Android知識(shí)的話,都一定會(huì)知道驴剔,一個(gè)應(yīng)用的組成,往往包含了許多的activity組件,每個(gè)activity都應(yīng)該圍繞用戶的特定動(dòng)作進(jìn)行跳轉(zhuǎn)設(shè)計(jì)峦朗。比如說,一個(gè)電話通訊錄的應(yīng)用可能有一個(gè)總體展示電話錄上所有存儲(chǔ)的姓名的activity排龄,當(dāng)用戶選擇指定的姓名時(shí)甚垦,可以啟動(dòng)另一個(gè)新的activity用來展示選中此姓名的詳細(xì)內(nèi)容。當(dāng)然涣雕,一個(gè)activity也可以用來打開同一臺(tái)手機(jī)但存在在其它應(yīng)用的activity艰亮,比如,你的應(yīng)用想要發(fā)送一份郵件時(shí)挣郭,可以定義一個(gè)intent來執(zhí)行一個(gè)"send"動(dòng)作并包含一個(gè)數(shù)據(jù)(地址和信息)迄埃,另一個(gè)應(yīng)用中此時(shí)有一個(gè)剛好可以處理這種intent的activity就會(huì)被打開(如果有多個(gè)activity支持同樣的intent,那么系統(tǒng)就會(huì)讓用戶自行選擇一個(gè))。當(dāng)email被發(fā)送后兑障,你的activity被恢復(fù)并且看起來發(fā)送郵件的activity好像是你應(yīng)用的一部分侄非。即使兩個(gè)activity來自不同的應(yīng)用,Android系統(tǒng)也能將兩個(gè)activity保存在同一個(gè)任務(wù)中來實(shí)現(xiàn)這種無縫隙的用戶體驗(yàn)流译。這里逞怨,我們就引出了一個(gè)概念,究竟何為Android中的任務(wù)Tasks福澡?它與啟動(dòng)模式又有什么關(guān)系叠赦?所謂的Back Stack又是什么?在本篇中革砸,我主要分享一下Tasks與Back Stack的基本介紹除秀,為之后介紹android的啟動(dòng)模式做一下鋪墊。當(dāng)然算利,若你想詳細(xì)了解此內(nèi)容册踩,也可以訪問官方文檔:Task and Back Stack

2. Tasks與Back Stack

一般說來,Tasks是我們在執(zhí)行某種工作時(shí)所交互的activity的集合效拭,這些activity集合按照打開的順序被放置在同一個(gè)棧中暂吉,這個(gè)棧叫作Back Stack(我稱為后退棧)胖秒。當(dāng)我們點(diǎn)擊到launcher上的圖標(biāo)時(shí),這個(gè)圖標(biāo)對(duì)應(yīng)的應(yīng)用的task則會(huì)被置換到前臺(tái)慕的。若這個(gè)應(yīng)用不存在task扒怖,也說明沒有打開過或者打開過但被銷毀了,那么就會(huì)為這個(gè)應(yīng)用創(chuàng)建一個(gè)新的task业稼,此時(shí)這個(gè)應(yīng)用的MainActivity則會(huì)被創(chuàng)建盗痒,然后作為根Activity被壓入到這個(gè)task中。

當(dāng)當(dāng)前的Activity啟動(dòng)了另外一個(gè)activity之后低散,新的activity就會(huì)被壓入棧頂俯邓,并擁有焦點(diǎn)。之前的activity仍然保存在棧中熔号,但是狀態(tài)是停止的稽鞭。當(dāng)activity處于棧中的時(shí)候,系統(tǒng)會(huì)保留當(dāng)前界面的狀態(tài)引镊,當(dāng)用戶按下back鍵時(shí)朦蕴,當(dāng)前就activity就會(huì)從stack中彈出銷毀,之前的一個(gè)activity就會(huì)從保存的狀態(tài)中恢復(fù)弟头。在棧中的順序不能被重新安排吩抓,只允許在棧上執(zhí)行壓入和彈出。當(dāng)創(chuàng)建新的activity的時(shí)候赴恨,壓入棧中疹娶;當(dāng)按下后退鍵的時(shí)候,彈出棧中伦连。因此雨饺,后退棧是一個(gè)“后進(jìn)先出”的結(jié)構(gòu)體。如下圖:

back_stack

當(dāng)然惑淳,如果我們不停的按后退鍵额港,棧中的activity會(huì)不停的被彈出,直到回到home界面(或者回到創(chuàng)建task的正在運(yùn)行的activity)歧焦。當(dāng)所有的activity都從棧中移除之后移斩,這個(gè)task就被銷毀了。

task可以被整體移到后臺(tái)倚舀,當(dāng)用戶啟動(dòng)了一個(gè)新的task叹哭,或者按下了home按鈕忍宋。后臺(tái)task中的所有activity的狀態(tài)都是停止的痕貌,task的stack中的內(nèi)容被保存下來,只是task失去了焦點(diǎn)糠排。

我們需要注意的是:后臺(tái)可以保持多個(gè)Task同時(shí)存在舵稠,但是,若在同一時(shí)刻后臺(tái)運(yùn)行了太多的Task,這時(shí)系統(tǒng)要能會(huì)銷毀后臺(tái)的Activity哺徊,以用來回收內(nèi)存室琢,這會(huì)導(dǎo)致activity狀態(tài)的丟失。

3. 保存Activity的狀態(tài)

按照前面所說的落追,當(dāng)Activity停止時(shí)(Stopped)時(shí)盈滴,系統(tǒng)默認(rèn)會(huì)保存其狀態(tài)。當(dāng)我們通過back鍵回到這個(gè)Activity時(shí)就會(huì)恢復(fù)離開時(shí)候的界面轿钠。當(dāng)然巢钓,當(dāng)多個(gè)Tasks同時(shí)保存在后臺(tái)時(shí),系統(tǒng)也有可能會(huì)銷毀后臺(tái)的activity疗垛,以回收內(nèi)存症汹。在這種情況下,系統(tǒng)仍然會(huì)知道Activity在task中的位置贷腕,當(dāng)通過back鍵回到這個(gè)Activity時(shí)背镇,系統(tǒng)會(huì)重新創(chuàng)建(recreate)一個(gè)Activity,而不是像之前一樣恢復(fù)(resume)它泽裳,因此瞒斩,為了不丟失Activity的內(nèi)容,我們可以通過實(shí)現(xiàn)onSaveInstanceState()方法來主動(dòng)保存數(shù)據(jù)涮总。

4. 總結(jié)

通過上面對(duì)Task與back stack的學(xué)習(xí)济瓢,相信對(duì)于一些概念有了更加清楚的認(rèn)識(shí),現(xiàn)在我們可以總結(jié)一下:

  • activity A 啟動(dòng)activity B妹卿,activity A 停止旺矾,但是系統(tǒng)還是保留著它的狀態(tài)。當(dāng)用戶在activity B上按下后退按鍵夺克,activity A會(huì)從保留的狀態(tài)中的恢復(fù)運(yùn)行箕宙。

  • 當(dāng)用戶按下home鍵后離開一個(gè)task,這個(gè)task的當(dāng)前activity停止铺纽,整個(gè)task進(jìn)入到后臺(tái)柬帕。系統(tǒng)保留著stack中的每一個(gè)activity的狀態(tài)。如果用戶點(diǎn)擊launcher上的task圖標(biāo)狡门,這個(gè)task就會(huì)被重新放到前臺(tái)陷寝,task的棧頂activity也會(huì)恢復(fù)運(yùn)行。

  • 當(dāng)用戶按下后退按鈕其馏,棧頂?shù)腶ctivity就會(huì)從棧中彈出銷毀凤跑,之前的activity就會(huì)恢復(fù)運(yùn)行。activity被銷毀后叛复,系統(tǒng)不會(huì)保持它的狀態(tài)仔引。

  • 有的activity可以被實(shí)例化多次扔仓,甚至是從不同的task。

  • 當(dāng)后臺(tái)中有同時(shí)存在多個(gè)Task時(shí)咖耘,系統(tǒng)可能會(huì)銷毀保存在后臺(tái)的activity以回收內(nèi)存翘簇,為了不丟失activity中內(nèi)容,我們可通過onSaveInstanceState()方法保存數(shù)據(jù)儿倒。

Android系統(tǒng)管理Task版保,是通過將所有的activity按照啟動(dòng)的順序壓入到一個(gè)Task中,若一個(gè)Activity被啟動(dòng)多次夫否,會(huì)默認(rèn)創(chuàng)建它的多個(gè)實(shí)例找筝,然后將新的實(shí)例壓入。當(dāng)然慷吊,我們也可以打破這種默認(rèn)的行為袖裕。可能你想在你應(yīng)用的activity啟動(dòng)時(shí)開始一個(gè)新的任務(wù)(而不是放置到當(dāng)前棧中)溉瓶;或者急鳄,當(dāng)你啟動(dòng)一個(gè)activity,你想把已經(jīng)運(yùn)行的它的一個(gè)實(shí)例提到前臺(tái)來(而不是創(chuàng)建一個(gè)新的實(shí)例放在后退棧的頂端)堰酿;或者疾宏,你希望當(dāng)用戶離開任務(wù)時(shí),你的后退棧清除除了根activity以外所有的activity触创。對(duì)于這些行為坎藐,我們該如何進(jìn)行設(shè)置?

好了哼绑,今天的分享就到這里岩馍,接下來我會(huì)針對(duì)上面的問題分享Android的啟動(dòng)模式,希望大家持續(xù)關(guān)注!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抖韩,一起剝皮案震驚了整個(gè)濱河市蛀恩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌茂浮,老刑警劉巖双谆,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異席揽,居然都是意外死亡顽馋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門幌羞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寸谜,“玉大人,你說我怎么就攤上這事新翎〕膛粒” “怎么了住练?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵地啰,是天一觀的道長愁拭。 經(jīng)常有香客問我,道長亏吝,這世上最難降的妖魔是什么岭埠? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮蔚鸥,結(jié)果婚禮上惜论,老公的妹妹穿的比我還像新娘。我一直安慰自己止喷,他們只是感情好馆类,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著弹谁,像睡著了一般乾巧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上预愤,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天沟于,我揣著相機(jī)與錄音,去河邊找鬼植康。 笑死旷太,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的销睁。 我是一名探鬼主播供璧,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼冻记!你這毒婦竟也來了嗜傅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤檩赢,失蹤者是張志新(化名)和其女友劉穎吕嘀,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贞瞒,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡偶房,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了军浆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棕洋。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖乒融,靈堂內(nèi)的尸體忽然破棺而出掰盘,到底是詐尸還是另有隱情摄悯,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布愧捕,位于F島的核電站奢驯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏次绘。R本人自食惡果不足惜瘪阁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望邮偎。 院中可真熱鬧管跺,春花似錦、人聲如沸禾进。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泻云。三九已至艇拍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間壶愤,已是汗流浹背淑倾。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留征椒,地道東北人娇哆。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像勃救,于是被迫代替她去往敵國和親碍讨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

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