Android Activity的4種啟動(dòng)模式圖文介紹
前言
記得第一次探討Activity的啟動(dòng)模式,是在2017年8月份,那個(gè)時(shí)候?qū)σ荒旰笞叱鲂iT的未來很是憧憬,時(shí)間真快,已經(jīng)畢業(yè)四個(gè)月,工作和生活也都趨于穩(wěn)定。
一、小前言
相信很多人和我一樣,在初學(xué)Android甚至初入職場的時(shí)候不了解Acticity的啟動(dòng)模式,或者為了面試刷題刷到了,但并不理解啟動(dòng)模式的作用,以及如何正確的使用啟動(dòng)模式而不是所有的都是用默認(rèn)模式。
二、Activity啟動(dòng)模式簡介
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呢?沒錯(cuò),是再次創(chuàng)建一個(gè)ActivityB實(shí)例
那么此時(shí),我們點(diǎn)擊返回鍵,會(huì)首先移除棧頂?shù)腁ctivityB,回到ActivityC,在移除棧頂?shù)腁ctivityC回到ActivityB,以此類推。
當(dāng)Activity全部退出時(shí),系統(tǒng)會(huì)自動(dòng)回收這個(gè)空棧。
2.2 singleTop模式
改變Activity的啟動(dòng)模式,可以在配置文件中為Activity添加lauchMode屬性
singleTop模式為棧頂復(fù)用模式,通俗的說,就是如果棧頂?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)前棧的情況比較特殊,這里簡單介紹
假設(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所需的棧名稱,這里就要說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ù)用模式,不過,比如現(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)模式
除了在配置文件中,我們還可以通過在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)流程
- 通過實(shí)例解析android Activity啟動(dòng)過程
- Android中Activity的四種啟動(dòng)模式和onNewIntent()
- Android Activity的啟動(dòng)過程源碼解析
- 分析Android Activity的啟動(dòng)過程
- Android 啟動(dòng)另一個(gè)App/apk中的Activity實(shí)現(xiàn)代碼
- Android?Activity啟動(dòng)流程刨析
相關(guān)文章
使用ViewPager實(shí)現(xiàn)高仿launcher左右拖動(dòng)效果
今天用ViewPager這個(gè)類實(shí)現(xiàn)了同樣的左右拖動(dòng)效果,這樣代碼更少,但是效果是一樣的,ViewPager是實(shí)現(xiàn)左右兩個(gè)屏幕平滑地切換的一個(gè)類,它是Google提供的,有需要的朋友可以了解下2013-01-01
Android實(shí)現(xiàn)簡單的popupwindow提示框
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)簡單的popupwindow提示框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10
Android中RecyclerView實(shí)現(xiàn)分頁滾動(dòng)的方法詳解
RecyclerView實(shí)現(xiàn)滾動(dòng)相信對(duì)大家來說都不陌生,但是本文主要給大家介紹了利用Android中RecyclerView實(shí)現(xiàn)分頁滾動(dòng)的思路和方法,可以實(shí)現(xiàn)翻頁功能,一次翻一頁,也可以實(shí)現(xiàn)翻至某一頁功能。文中給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面來一起看看吧。2017-04-04
Android實(shí)現(xiàn)圖片點(diǎn)擊放大
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)圖片點(diǎn)擊放大,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10
Flutter 系統(tǒng)是如何實(shí)現(xiàn)ExpansionPanelList的示例代碼
Flutter組件有一個(gè)很大的特色,那就是很多復(fù)雜的組件都是通過一個(gè)一個(gè)小組件拼裝而成的,今天就來說說系統(tǒng)的ExpansionPanelList是如何實(shí)現(xiàn)的,需要的朋友可以參考下2020-05-05
Android Loader詳細(xì)介紹及實(shí)例代碼
這篇文章主要介紹了Android Loader詳細(xì)介紹及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-12-12
Android入門之ListView應(yīng)用解析(一)
這篇文章主要介紹了Android入門之ListView應(yīng)用,簡單說明了ListView的實(shí)現(xiàn),需要的朋友可以參考下2014-08-08
使用Android WebSocket實(shí)現(xiàn)即時(shí)通訊功能
即時(shí)通訊(Instant Messaging)最重要的毫無疑問就是即時(shí),不能有明顯的延遲,要實(shí)現(xiàn)IM的功能其實(shí)并不難,目前有很多第三方,比如極光的JMessage,都比較容易實(shí)現(xiàn)。本文通過實(shí)例代碼給大家分享Android WebSocket實(shí)現(xiàn)即時(shí)通訊功能,一起看看吧2019-10-10

