android singleinstance home,Android启动模式之singleinstance的坑
前言
在實(shí)際應(yīng)用中,使用singleinstance啟動(dòng)模式時(shí),會(huì)遇到一些奇奇怪怪的問(wèn)題。Android有四種啟動(dòng)模式,分別是standard,singleTop,singleTask,singleInstance。下面分別簡(jiǎn)單的介紹下這四種啟動(dòng)模式的作用。
standard
Android 默認(rèn)的一種啟動(dòng)模式。不需要為activity設(shè)置launchMode。這種啟動(dòng)模式簡(jiǎn)單的來(lái)說(shuō)就是當(dāng)你startActivity的時(shí)候,他就創(chuàng)建一個(gè)。
singleTop
這種模式模式從字面意思就能看得出來(lái),就是當(dāng)前的activity處于棧頂?shù)臅r(shí)候,當(dāng)你startActivity當(dāng)前的activity的時(shí)候,它不會(huì)創(chuàng)建新的activity,而是會(huì)復(fù)用之前的activity。舉個(gè)例子,startActivity了一個(gè)ActivityA,ActivityA又startActivity了ActivityB,當(dāng)在ActivityB再次startActivity一個(gè)ActivityB的時(shí)候,它不會(huì)創(chuàng)建一個(gè)新的ActivityB,而是復(fù)用之前的ActivityB。
這里需要注意的是,只有當(dāng)前的activity處于棧頂?shù)臅r(shí)候才管用。舉個(gè)例子:startActivity了一個(gè)ActivityA,ActivityA又startActivity了ActivityB,ActivityB又startActivity了ActivityA,那么ActivityA還是會(huì)重新創(chuàng)建,而不是復(fù)用之前的ActivityA。
singleTask
單一任務(wù)。意思就是說(shuō)當(dāng)前的activity只有一個(gè)實(shí)例,無(wú)論在任何地方startActivity出來(lái)這個(gè)activity,它都只存在一個(gè)實(shí)例。并且,它會(huì)將在他之上的所有activity都銷(xiāo)毀。通常這個(gè)activity都是用來(lái)作為MainActivity。因?yàn)橹黜?yè)只需要存在一個(gè),然后回到主頁(yè)的時(shí)候可以將所有的activity都銷(xiāo)毀起到退出應(yīng)用的作用。舉個(gè)例子,startActivity了一個(gè)ActivityA,ActivityA的啟動(dòng)模式為singleTask,那么在ActivityA里startActivity了一個(gè)ActivityB,在ActivityB里startActivity了一個(gè)ActivityC。此時(shí)在當(dāng)前的任務(wù)棧中的順序是,ActivityA->ActivityB->ActivityC。然后在ActivityC里重新startActivity了一個(gè)ActivityA,此時(shí)ActivityA會(huì)將存在于它之上的所有activity都銷(xiāo)毀。所以此時(shí)任務(wù)棧中就只剩下ActivityC了。
singleInstance
這個(gè)模式才是重點(diǎn),也是比較容易入坑的一種啟動(dòng)模式。字面上理解為單一實(shí)例。它具備所有singleTask的特點(diǎn),唯一不同的是,它是存在于另一個(gè)任務(wù)棧中。上面的三種模式都存在于同一個(gè)任務(wù)棧中,而這種模式則是存在于另一個(gè)任務(wù)棧中。舉個(gè)例子,上面的啟動(dòng)模式都存在于地球上,而這種模式存在于火星上。整個(gè)Android系統(tǒng)就是個(gè)宇宙。下面來(lái)詳細(xì)介紹一下singleInstance的坑。
singleInstance之一坑
此時(shí)有三個(gè)activity,ActivityA,ActivityB,ActivityC,除了ActivityB的啟動(dòng)模式為singleInstance,其他的啟動(dòng)模式都為默認(rèn)的。startActivity了一個(gè)ActivityA,在ActivityA里startActivity了一個(gè)ActivityB,在ActivityB里startActivity了一個(gè)ActivityC。此時(shí)在當(dāng)前的任務(wù)棧中的順序是,ActivityA->ActivityB->ActivityC。照理來(lái)說(shuō)在當(dāng)前ActivityC頁(yè)面按返回鍵,finish當(dāng)前界面后應(yīng)當(dāng)回到ActivityB界面。但是事與愿違,奇跡出現(xiàn)了,頁(yè)面直接回到了ActivityA。這是為什么呢?其實(shí)想想就能明白了,上面已經(jīng)說(shuō)過(guò),singleInstance模式是存在于另一個(gè)任務(wù)棧中的。也就是說(shuō)ActivityA和ActivityC是處于同一個(gè)任務(wù)棧中的,ActivityB則是存在另個(gè)棧中。所以當(dāng)關(guān)閉了ActivityC的時(shí)候,它自然就會(huì)去找當(dāng)前任務(wù)棧存在的activity。當(dāng)前的activity都關(guān)閉了之后,才會(huì)去找另一個(gè)任務(wù)棧中的activity。也就是說(shuō)當(dāng)在ActivityC中finish之后,會(huì)回到ActivityA的界面,在ActivityA里finish之后會(huì)回到ActivityB界面。如果還想回到ActivityB的頁(yè)面怎么辦呢?我的做法是,在ActivityB定義一個(gè)全局變量,public static boolean returnActivityB;界面需要跳轉(zhuǎn)的時(shí)候?qū)eturnActivityB=true;然后在ActivityA界面onstart方法里判斷returnActivityB是否為true,是的話(huà)就跳轉(zhuǎn)到ActivityB,同時(shí)將returnActivityB=false;這樣就能解決跳轉(zhuǎn)的問(wèn)題了。不過(guò)感覺(jué)還不是很好,如果有更好的方法,歡迎大家給我留言告訴我一聲。
singleInstance之二坑
此時(shí)有兩個(gè)個(gè)activity,ActivityA,ActivityB,ActivityA的啟動(dòng)模式為默認(rèn)的,ActivityB的啟動(dòng)模式為singleInstance。當(dāng)在ActivityA里startActivity了ActivityB,當(dāng)前頁(yè)面為ActivityB。按下home鍵。應(yīng)用退到后臺(tái)。此時(shí)再點(diǎn)擊圖標(biāo)進(jìn)入APP,按照天理來(lái)說(shuō),此時(shí)的界面應(yīng)該是ActivityB,可是奇跡又出現(xiàn)了,當(dāng)前顯示的界面是ActivityA。這是因?yàn)楫?dāng)重新啟動(dòng)的時(shí)候,系統(tǒng)會(huì)先去找主棧(我是這么叫的)里的activity,也就是APP中LAUNCHER的activity所處在的棧。查看是否有存在的activity。沒(méi)有的話(huà)則會(huì)重新啟動(dòng)LAUNCHER。要解決這個(gè)方法則是和一坑的解決辦法一樣,在ActivityB定義一個(gè)全局變量,public static boolean returnActivityB;在oncreat方法將returnActivityB=true;然后在ActivityA界面onstart方法里判斷returnActivityB是否為true,是的話(huà)就跳轉(zhuǎn)到ActivityB,同時(shí)將returnActivityB=false;這樣就能解決跳轉(zhuǎn)的問(wèn)題了。
總結(jié)
Android的啟動(dòng)模式如果利用的好,還是可以解決很多問(wèn)題的。啟動(dòng)模式還是值得好好的研究一下的。歡迎各位指教出錯(cuò)誤,共同學(xué)習(xí)。
原文:https://www.cnblogs.com/Im-Victor/p/9656471.html
總結(jié)
以上是生活随笔為你收集整理的android singleinstance home,Android启动模式之singleinstance的坑的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: android点击textview后选择
- 下一篇: android app 主界面,andr