如何正確理解和使用Activity的4種啟動模式
關(guān)于Activity啟動模式的文章已經(jīng)很多,但有的文章寫得過于簡單,有的則過于注重細(xì)節(jié),本文想取一個折中,只關(guān)注最重要和最常用的概念,原理和使用方法,便于讀者正確應(yīng)用。
Activity的啟動模式有4種,分別是standard.singleTop. SingleTask. singleInstance,可以在AndroidMainifest.xml文件中指定每一個Activity的啟動模式。一個Android應(yīng)用一般都會有多個Activity,系統(tǒng)會通過任務(wù)棧來管理這些Activity,棧是一種后進(jìn)先出的集合,當(dāng)前的Activity就在棧頂,按返回鍵,棧頂Activity就會退出。Activity啟動模式不同,系統(tǒng)通過任務(wù)棧管理Activity的方式也會不同,以下將分別介紹。
1 Standard模式
Standard模式是Android的默認(rèn)啟動模式,你不在配置文件中做任何設(shè)置,那么這個Activity就是standard模式,這種模式下,Activity可以有多個實例,每次啟動Activity,無論任務(wù)棧中是否已經(jīng)有這個Activity的實例,系統(tǒng)都會創(chuàng)建一個新的Activity實例,以下是實驗驗證。
新建一個FirstActivity,用一個Button去啟動它本身:

發(fā)現(xiàn)每次都會啟動一個新的FristActivity, Log信息如下

什么時候用standard模式呢?standartd模式是activity的默認(rèn)模式,大部分情況下,都應(yīng)該使用這種模式,也就是在配置文件中什么都不用做,當(dāng)確實有特殊需求時,再考慮其他模式。
2 SingleTop模式
SingleTop模式和standard模式非常相似,主要區(qū)別就是當(dāng)一個singleTop模式的Activity已經(jīng)位于任務(wù)棧的棧頂,再去啟動它時,不會再創(chuàng)建新的實例,如果不位于棧頂,就會創(chuàng)建新的實例,現(xiàn)在把配置文件中FirstActivity的啟動模式改為SingleTop,我們的應(yīng)用只有一個Activity,F(xiàn)irstActivity自然處于任務(wù)棧的棧頂。
當(dāng)應(yīng)用第一次啟動后,我們再按Button去啟動新的FirstActivity,發(fā)現(xiàn)Log信息中不再打印onCreate函數(shù),說明不再創(chuàng)建新的FirstActivity實例。
這里有一個新的問題,對于每次啟動Activity,我們該如何分別處理。答案就是onNewIntent()函數(shù),雖然系統(tǒng)不會調(diào)用onCreat(),但會調(diào)用onNewIntent,我們可以在這個函數(shù)做相應(yīng)的處理。

當(dāng)一個Activity已經(jīng)在棧頂,但依然有可能啟動它,而你又不想產(chǎn)生新的Activity實例,此時就可以用singleTop模式。例如,一個搜索Activity,可以輸入搜索內(nèi)容,也可以產(chǎn)生搜索結(jié)果,此時就可以用singleTop模式,不會用戶每次搜索都會產(chǎn)生一個實例。
3 SingleTask模式
SingleTask模式的Activity在同一個Task內(nèi)只有一個實例,如果Activity已經(jīng)位于棧頂,系統(tǒng)不會創(chuàng)建新的Activity實例,和singleTop模式一樣。但Activity已經(jīng)存在但不位于棧頂時,系統(tǒng)就會把該Activity移到棧頂,并把它上面的activity出棧。修改上面的程序,新建一個SecondActivity,將FirstActivity設(shè)置為singleTask啟動模式,并讓它啟動SecondActivity,再讓SecondActivity來啟動FirstActivity。

Log信息如下

當(dāng)SecondActivity啟動FirstActivity時,并不會調(diào)用FirstActivity的onCreate函數(shù),但會調(diào)用onNewIntent函數(shù),同時會調(diào)用SecondActivity的onDestroy函數(shù),SecondActivity實例被銷毀。
singleTask模式和前面兩種模式的最大區(qū)別就是singleTask模式是任務(wù)內(nèi)單例的,所以我們是否設(shè)定Activity為singleTask模式,就是看我們activity是否需要單例,例如你的某個Activity
里面有一個列表,如果有多個實例,有可能導(dǎo)致用戶看到的列表不一致,有的Activity需要經(jīng)常啟動,如果每次都創(chuàng)建實例,會導(dǎo)致占用資源過多,這些情況都可以使用singleTask模式,但啟動singleTask模式的Activity會導(dǎo)致任務(wù)棧內(nèi)它上面的Activity被銷毀,有可能會影響用戶體驗,使用時要注意。
4 SingleInstance模式
singleInstance模式也是單例的,但和singleTask不同,singleTask只是任務(wù)棧內(nèi)單例,系統(tǒng)里是可以有多個singleTask Activity實例的,而singleInstance Activity在整個系統(tǒng)里只有一個實例,啟動一singleInstanceActivity時,系統(tǒng)會創(chuàng)建一個新的任務(wù)棧,并且這個任務(wù)棧只有他一個Activity。
SingleInstance模式并不常用,如果我們把一個Activity設(shè)置為singleInstance模式,你會發(fā)現(xiàn)它啟動時會慢一些,切換效果不好,影響用戶體驗。它往往用于多個應(yīng)用之間,例如一個電視launcher里的Activity,通過遙控器某個鍵在任何情況可以啟動,這個Activity就可以設(shè)置為singleInstance模式,當(dāng)在某應(yīng)用中按鍵啟動這個Activity,處理完后按返回鍵,就會回到之前啟動它的應(yīng)用,不影響用戶體驗。
以上分析了Activity的4種啟動模式,將Activity設(shè)置為哪種啟動模式并沒有標(biāo)準(zhǔn)答案,有時候,你可能發(fā)現(xiàn)將某個Activity設(shè)置為一種啟動模式或者另一種啟動模式,并沒有明顯區(qū)別,而具體的評判標(biāo)準(zhǔn)就是看哪種模式更滿足應(yīng)用功能,更有利于用戶體驗。
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!
- Android Activity啟動模式之singleTop實例詳解
- Android Activity啟動模式之singleTask實例詳解
- Activity 四種啟動模式詳細(xì)介紹
- 簡單介紹Android中Activity的四種啟動模式
- Android入門之Activity四種啟動模式(standard、singleTop、singleTask、singleInstance)
- 詳解Activity之singletast啟動模式及如何使用intent傳值
- Android Activity啟動模式之standard實例詳解
- Android中Activity生命周期和啟動模式詳解
- Android Activity啟動模式全面解析
- Android Activity的4種啟動模式圖文介紹
相關(guān)文章
Android中默認(rèn)系統(tǒng)的聲音/大小修改和配置詳解
這篇文章主要給大家介紹了關(guān)于Android中默認(rèn)系統(tǒng)的聲音/大小修改和配置的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。2017-11-11
android通過okhttpClient下載網(wǎng)頁內(nèi)容的實例代碼
本篇文章主要介紹了android通過okhttpClient下載網(wǎng)頁內(nèi)容的實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08
Android開發(fā)之設(shè)置開機(jī)自動啟動的幾種方法
這篇文章主要介紹了Android開發(fā)之設(shè)置開機(jī)自動啟動的幾種方法的相關(guān)資料,這里提供三種方法幫助大家實現(xiàn)這樣的功能,需要的朋友可以參考下2017-08-08
詳談OnTouchListener與OnGestureListener的區(qū)別
下面小編就為大家?guī)硪黄斦凮nTouchListener與OnGestureListener的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04
Android 實現(xiàn)閃屏頁和右上角的倒計時跳轉(zhuǎn)實例代碼
本文給大家分享一段實例代碼給大家介紹android實現(xiàn)閃屏頁和右上角的倒計時跳轉(zhuǎn)實例代碼,閃屏頁用到了handler和CountDownTimer類,還需配置一下Activity的主題,感興趣的朋友參考下吧2016-02-02
關(guān)于ADB的Android Debug Bridge(安卓調(diào)試橋)那些事
這篇文章主要介紹了關(guān)于ADB的Android Debug Bridge(安卓調(diào)試橋)那些事,需要的朋友可以參考下2019-10-10
Android開發(fā)中的幾種網(wǎng)絡(luò)請求方式詳解
本篇文章主要包括Android中的幾種網(wǎng)絡(luò)請求方式詳解,具有一定的參考價值,有需要的可以了解一下。2016-11-11

