關(guān)于Activity啟動(dòng)模式的文章已經(jīng)很多巷疼,但有的文章寫(xiě)得過(guò)于簡(jiǎn)單,有的則過(guò)于注重細(xì)節(jié)灵奖,本文想取一個(gè)折中嚼沿,只關(guān)注最重要和最常用的概念,原理和使用方法瓷患,并提供一個(gè)簡(jiǎn)單的Demo骡尽,便于大家理解。
Activity的啟動(dòng)模式有4種擅编,分別是standard.singleTop. SingleTask. singleInstance攀细,可以在AndroidMainifest.xml文件中指定每一個(gè)Activity的啟動(dòng)模式。一個(gè)Android應(yīng)用一般都會(huì)有多個(gè)Activity爱态,系統(tǒng)會(huì)通過(guò)任務(wù)棧來(lái)管理這些Activity谭贪,棧是一種后進(jìn)先出的集合,當(dāng)前的Activity就在棧頂锦担,按返回鍵俭识,棧頂Activity就會(huì)退出。Activity啟動(dòng)模式不同洞渔,系統(tǒng)通過(guò)任務(wù)棧管理Activity的方式也會(huì)不同套媚,以下將分別介紹。
1磁椒、Standard模式
Standard模式是Android的默認(rèn)啟動(dòng)模式堤瘤,你不在配置文件中做任何設(shè)置,那么這個(gè)Activity就是standard模式浆熔,這種模式下本辐,Activity可以有多個(gè)實(shí)例,每次啟動(dòng)Activity医增,無(wú)論任務(wù)棧中是否已經(jīng)有這個(gè)Activity的實(shí)例师郑,系統(tǒng)都會(huì)創(chuàng)建一個(gè)新的Activity實(shí)例。
什么時(shí)候用standard模式呢调窍?standartd模式是activity的默認(rèn)模式宝冕,大部分情況下,都應(yīng)該使用這種模式邓萨,也就是在配置文件中什么都不用做地梨,當(dāng)確實(shí)有特殊需求時(shí)菊卷,再考慮其他模式。
2宝剖、SingleTop模式
SingleTop模式和standard模式非常相似洁闰,主要區(qū)別就是當(dāng)一個(gè)singleTop模式的Activity已經(jīng)位于任務(wù)棧的棧頂,再去啟動(dòng)它時(shí)万细,不會(huì)再創(chuàng)建新的實(shí)例扑眉,不過(guò)會(huì)調(diào)用onNewIntent()函數(shù),如果不位于棧頂赖钞,就會(huì)創(chuàng)建新的實(shí)例腰素,現(xiàn)在把配置文件中FirstActivity的啟動(dòng)模式改為SingleTop,我們的應(yīng)用只有一個(gè)Activity雪营,F(xiàn)irstActivity自然處于任務(wù)棧的棧頂弓千。
? 當(dāng)一個(gè)Activity已經(jīng)在棧頂,但依然有可能啟動(dòng)它献起,而你又不想產(chǎn)生新的Activity實(shí)例洋访,此時(shí)就可以用singleTop模式。例如谴餐,一個(gè)搜索Activity姻政,可以輸入搜索內(nèi)容,也可以產(chǎn)生搜索結(jié)果岂嗓,此時(shí)就可以用singleTop模式扶歪,不會(huì)用戶每次搜索都會(huì)產(chǎn)生一個(gè)實(shí)例。
3摄闸、SingleTask模式
? SingleTask模式的Activity在同一個(gè)Task內(nèi)只有一個(gè)實(shí)例,如果Activity已經(jīng)位于棧頂妹萨,系統(tǒng)不會(huì)創(chuàng)建新的Activity實(shí)例年枕,和singleTop模式一樣。但Activity已經(jīng)存在但不位于棧頂時(shí)乎完,系統(tǒng)就會(huì)把該Activity移到棧頂熏兄,并把它上面的activity出棧。
singleTask模式和前面兩種模式的最大區(qū)別就是singleTask模式是任務(wù)內(nèi)單例的树姨,所以我們是否設(shè)定Activity為singleTask模式摩桶,就是看我們activity是否需要單例,例如你的某個(gè)Activity
里面有一個(gè)列表帽揪,如果有多個(gè)實(shí)例硝清,有可能導(dǎo)致用戶看到的列表不一致,有的Activity需要經(jīng)常啟動(dòng)转晰,如果每次都創(chuàng)建實(shí)例芦拿,會(huì)導(dǎo)致占用資源過(guò)多士飒,這些情況都可以使用singleTask模式,但啟動(dòng)singleTask模式的Activity會(huì)導(dǎo)致任務(wù)棧內(nèi)它上面的Activity被銷毀蔗崎,有可能會(huì)影響用戶體驗(yàn)酵幕,使用時(shí)要注意。
4缓苛、SingleInstance模式
singleInstance模式也是單例的芳撒,但和singleTask不同,singleTask只是任務(wù)棧內(nèi)單例未桥,系統(tǒng)里是可以有多個(gè)singleTask Activity實(shí)例的笔刹,而singleInstance Activity在整個(gè)系統(tǒng)里只有一個(gè)實(shí)例,啟動(dòng)一singleInstanceActivity時(shí)钢属,系統(tǒng)會(huì)創(chuàng)建一個(gè)新的任務(wù)棧徘熔,并且這個(gè)任務(wù)棧只有他一個(gè)Activity。
SingleInstance模式并不常用淆党,如果我們把一個(gè)Activity設(shè)置為singleInstance模式酷师,你會(huì)發(fā)現(xiàn)它啟動(dòng)時(shí)會(huì)慢一些,切換效果不好染乌,影響用戶體驗(yàn)山孔。它往往用于多個(gè)應(yīng)用之間,例如一個(gè)電視launcher里的Activity荷憋,通過(guò)遙控器某個(gè)鍵在任何情況可以啟動(dòng)台颠,這個(gè)Activity就可以設(shè)置為singleInstance模式,當(dāng)在某應(yīng)用中按鍵啟動(dòng)這個(gè)Activity勒庄,處理完后按返回鍵串前,就會(huì)回到之前啟動(dòng)它的應(yīng)用,不影響用戶體驗(yàn)实蔽。
以上分析了Activity的4種啟動(dòng)模式荡碾,將Activity設(shè)置為哪種啟動(dòng)模式并沒(méi)有標(biāo)準(zhǔn)答案,有時(shí)候局装,你可能發(fā)現(xiàn)將某個(gè)Activity設(shè)置為一種啟動(dòng)模式或者另一種啟動(dòng)模式坛吁,并沒(méi)有明顯區(qū)別,而具體的評(píng)判標(biāo)準(zhǔn)就是看哪種模式更滿足應(yīng)用功能铐尚,更有利于用戶體驗(yàn)拨脉。
備注: Demo下載