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)體。如下圖:
當(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)注!