Android Activity的4種啟動(dòng)模式圖文介紹
前言
記得第一次探討Activity的啟動(dòng)模式,是在2017年8月份,那個(gè)時(shí)候?qū)σ荒旰笞叱鲂iT(mén)的未來(lái)很是憧憬,時(shí)間真快,已經(jīng)畢業(yè)四個(gè)月,工作和生活也都趨于穩(wěn)定。
一、小前言
相信很多人和我一樣,在初學(xué)Android甚至初入職場(chǎng)的時(shí)候不了解Acticity的啟動(dòng)模式,或者為了面試刷題刷到了,但并不理解啟動(dòng)模式的作用,以及如何正確的使用啟動(dòng)模式而不是所有的都是用默認(rèn)模式。
二、Activity啟動(dòng)模式簡(jiǎn)介
Activity有四種啟動(dòng)模式,standard、singleTop、singleTask、singleInstance,默認(rèn)啟動(dòng)模式是standard
2.1 standard 模式
程序啟動(dòng)的時(shí)候,會(huì)默認(rèn)創(chuàng)建一個(gè)任務(wù)棧,Activity是放在任務(wù)棧里面的,比如我們新建一個(gè)項(xiàng)目,默認(rèn)生成一個(gè)ActivityA,那么此時(shí)任務(wù)棧是這樣的:
,比如我們?cè)贏ctivityA中有一個(gè)按鈕,點(diǎn)擊按鈕跳轉(zhuǎn)到ActivityB,ActivityB中有一個(gè)按鈕,點(diǎn)擊按鈕跳轉(zhuǎn)到ActivityC,那么此時(shí)該棧是這樣的:
那么如果在ActivityC中有個(gè)按鈕跳轉(zhuǎn)到ActivityB呢?沒(méi)錯(cuò),是再次創(chuàng)建一個(gè)ActivityB實(shí)例
那么此時(shí),我們點(diǎn)擊返回鍵,會(huì)首先移除棧頂?shù)腁ctivityB,回到ActivityC,在移除棧頂?shù)腁ctivityC回到ActivityB,以此類(lèi)推。
當(dāng)Activity全部退出時(shí),系統(tǒng)會(huì)自動(dòng)回收這個(gè)空棧。
2.2 singleTop模式
改變Activity的啟動(dòng)模式,可以在配置文件中為Activity添加lauchMode屬性
singleTop模式為棧頂復(fù)用模式,通俗的說(shuō),就是如果棧頂?shù)腁ctivity和啟動(dòng)的Activity的是同一個(gè),那么就直接復(fù)用,比如還是在ActivityA中跳轉(zhuǎn)到ActivityB,我們將ActivityB的啟動(dòng)模式設(shè)置為singleTop,因?yàn)楫?dāng)前棧頂是ActivityA,不是ActivityB,所以會(huì)創(chuàng)建新的ActivityB實(shí)例放入任務(wù)棧中
現(xiàn)在我們?cè)贏ctivityB中點(diǎn)擊按鈕跳轉(zhuǎn)ActivityB,因?yàn)楫?dāng)前棧頂就是ActivityB所以會(huì)直接復(fù)用,此時(shí)棧內(nèi)仍是ActivityB和ActivityA,此時(shí)點(diǎn)擊返回按鈕會(huì)直接退回到ActivityA。
2.3 singleTask 模式
singleTask是棧內(nèi)復(fù)用模式,在這里棧內(nèi)復(fù)用要區(qū)分要啟動(dòng)的Activity的所需棧是否是當(dāng)前棧
2.3.1 是當(dāng)前棧
比如現(xiàn)在有ActivityA 啟動(dòng)模式為singleTask ,在ActivityA中啟動(dòng)ActivityB,ActivityB在棧中不存在實(shí)例,則創(chuàng)建ActivityB實(shí)例,此時(shí)棧為:
假設(shè)現(xiàn)在在ActivityB中啟動(dòng)ActivityA,會(huì)在當(dāng)前棧中是否有ActivityA,若有則將ActivityA移到棧內(nèi),將位于ActivityA之上的移出棧頂,那么現(xiàn)在棧為:
此時(shí)按返回鍵會(huì)直接退出程序,如果當(dāng)前棧為
我們現(xiàn)在啟動(dòng)ActivityB中啟動(dòng)ActivityA,則會(huì)將位于ActivityA棧頂?shù)腁ctivityB、ActivityC以及ActivityB移出棧頂,此時(shí)棧內(nèi)只是有ActivityA。
2.3.1 不是當(dāng)前棧
不是當(dāng)前棧的情況比較特殊,這里簡(jiǎn)單介紹
假設(shè)當(dāng)前任務(wù)棧是A,A棧中有ActivityA、ActivityB,在B中啟動(dòng)ActivityC,并且ActivityC所需的任務(wù)棧為B,棧B不存在所以會(huì)首先創(chuàng)建棧B,然后創(chuàng)建ActivityC實(shí)例放入棧B中
那么我們?nèi)绾沃付▎?dòng)的Activity所需的棧名稱(chēng),這里就要說(shuō)TaskAffinity參數(shù),這里我們參考官方文檔:
developer.android.com/guide/topic…
TaskAffinity可以理解為任務(wù)親屬性或相關(guān)性,默認(rèn)情況下,應(yīng)用中的所有 Activity 都具有相同的親和關(guān)系
默認(rèn)任務(wù)棧的名字為應(yīng)用包名,同樣我們可以在配置文件中設(shè)置TaskAffinity屬性,但必須和singleTask啟動(dòng)模式配對(duì)使用
2.4 singleInstance模式
singleInstance模式也是"棧內(nèi)"復(fù)用模式,不過(guò),比如現(xiàn)在當(dāng)前棧中有ActivityA,我們?cè)贏中啟動(dòng)ActivityB,ActivityB的啟動(dòng)模式是singleInstance,此時(shí)會(huì)創(chuàng)建一個(gè)新的任務(wù)棧,創(chuàng)建ActivityB實(shí)例將ActivityB放在新的任務(wù)棧中
2.5 Java代碼設(shè)置啟動(dòng)模式
除了在配置文件中,我們還可以通過(guò)在Java代碼中設(shè)置啟動(dòng)模式
intent.setFlags();
singleTask 對(duì)應(yīng) FLAG_ACTIVITY_NEW_TASK
singleTop 對(duì)應(yīng) FLAG_ACTIVITY_SINGLE_TOP
到此這篇關(guān)于Android Activity的4種啟動(dòng)模式的文章就介紹到這了,更多相關(guān)Android Activity的4種啟動(dòng)模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Android Activity的生命周期與啟動(dòng)模式全面解讀
- Android后臺(tái)啟動(dòng)Activity的實(shí)現(xiàn)示例
- 詳解Android Activity的啟動(dòng)流程
- 通過(guò)實(shí)例解析android Activity啟動(dòng)過(guò)程
- Android中Activity的四種啟動(dòng)模式和onNewIntent()
- Android Activity的啟動(dòng)過(guò)程源碼解析
- 分析Android Activity的啟動(dòng)過(guò)程
- Android 啟動(dòng)另一個(gè)App/apk中的Activity實(shí)現(xiàn)代碼
- Android?Activity啟動(dòng)流程刨析
相關(guān)文章
Android集成百度地圖開(kāi)發(fā)流程和注意事項(xiàng)
現(xiàn)在很多項(xiàng)目都需要集成百度地圖,所以就把自己做過(guò)一個(gè)項(xiàng)目的經(jīng)驗(yàn)寫(xiě)出來(lái)和大家分享,方便自己和大家使用的時(shí)候參考借鑒,下面就來(lái)一起看看Android集成百度地圖開(kāi)發(fā)流程和注意事項(xiàng)吧。2016-09-09Android使用屬性動(dòng)畫(huà)如何自定義倒計(jì)時(shí)控件詳解
自Android 3.0版本開(kāi)始,系統(tǒng)給我們提供了一種全新的動(dòng)畫(huà)模式,屬性動(dòng)畫(huà)(property animation),它的功能非常強(qiáng)大,下面這篇文章主要給大家介紹了關(guān)于Android使用屬性動(dòng)畫(huà)如何自定義倒計(jì)時(shí)控件的相關(guān)資料,需要的朋友可以參考下2018-05-05Android Presentation雙屏異顯開(kāi)發(fā)流程詳細(xì)講解
最近開(kāi)發(fā)的一個(gè)項(xiàng)目,有兩個(gè)屏幕,需要將第二個(gè)頁(yè)面投屏到副屏上,這就需要用到Android的雙屏異顯(Presentation)技術(shù)了,研究了一下,這里做下筆記2023-01-01android 網(wǎng)絡(luò)請(qǐng)求庫(kù)volley方法詳解
這篇文章主要介紹了android 網(wǎng)絡(luò)請(qǐng)求庫(kù)volley方法詳解的相關(guān)資料,需要的朋友可以參考下2016-09-09Android?十六進(jìn)制狀態(tài)管理實(shí)例詳解
這篇文章主要為大家介紹了Android?十六進(jìn)制狀態(tài)管理實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09Android實(shí)現(xiàn)系統(tǒng)語(yǔ)言切換功能
這篇文章主要為大家詳細(xì)介紹了Android系統(tǒng)語(yǔ)言切換功能的實(shí)現(xiàn)方法,感興趣的小伙伴們可以參考一下2016-03-03Android基礎(chǔ)之使用Fragment控制切換多個(gè)頁(yè)面
Android官方已經(jīng)提供了Fragment的各種使用的Demo例子,在我們SDK下面的API Demo里面就包含了Fragment的各種使用例子,需要看Demo的朋友,直接看API Demo那個(gè)程序就可以了,不用到處去找。里面分開(kāi)不同功能,實(shí)現(xiàn)了不同的類(lèi)2013-07-07