了解Activity啟動模式掌眠,這一篇就夠了@俣ⅰ!蓝丙!

??默認情況下级遭,當(dāng)我們多次啟動同一個Activity的時候,就會創(chuàng)建多個Activity實例迅腔,并把他們按照先進后出的順序放入同一個任務(wù)棧中装畅,當(dāng)我們返回的時候,就需要逐一退出各個實例沧烈。操作不便掠兄,并且多個實例也會造成內(nèi)存占用,影響性能锌雀。為避免這種情況蚂夕,Android提供了4種的啟動模式,來應(yīng)對各種復(fù)雜的啟動場景腋逆。

一婿牍、啟動模式分析

Activity的四種啟動模式如下:

1. Standard(default默認)標(biāo)準(zhǔn)默認模式

說明::允許多個實例存在,也允許多個實例重疊存在惩歉。每次啟動activity都會重新創(chuàng)建一個新的實例添加到任務(wù)棧中等脂。
生命周期::每次啟動都是新的實例,生命周期都會重新執(zhí)行撑蚌。

default開啟生命周期執(zhí)行.png

任務(wù)棧信息:每次開啟后在任務(wù)棧中都會開啟添加新的實例

default開啟任務(wù)棧信息.png

從圖中可以看出開啟4次任務(wù)棧中有4個實例上遥,并且都在同一個任務(wù)棧中

2. SingleTop棧頂復(fù)用模式

說明:允許多個實例存在,但不允許多個實例重疊存在争涌。例如:如果一個singleTop啟動的實例存在棧頂粉楚,那么再次啟動,就不會創(chuàng)建新的實例亮垫,而是調(diào)用onNewIntent()方法服用當(dāng)前實例模软。
生命周期:分為兩種情況:

  1. 要創(chuàng)建的Activity實例不在棧頂,會重新創(chuàng)建新的實例饮潦,生命周期會重新執(zhí)行

    SingleTop模式中不在棧頂新開實例生命周期.png

    任務(wù)棧信息:多個實例共存任務(wù)棧中燃异。
    singleTop中默認任務(wù)棧信息.png

  2. 新創(chuàng)建的實例 \color{#FF0000}{ 注意}\ 棧頂復(fù)用是不會重新執(zhí)行生命周期,會執(zhí)行onNewIntent()更新參數(shù)

    singleTop棧頂復(fù)用生命周期.png

    任務(wù)棧信息:棧頂只會存在一個singleTop模式activity继蜡,重新打開復(fù)用原來的
    singleTop棧頂復(fù)用情況下任務(wù)棧信息.png

3. SingleTask棧內(nèi)復(fù)用模式

說明:不允許多個實例存在特铝,不允許多個實例堆疊存在暑中。每次啟動都會判斷任務(wù)棧中是否存在當(dāng)前的實例,如果存在則會調(diào)用onNewIntent()方法復(fù)用當(dāng)前實例鲫剿,并且清空當(dāng)前實例在任務(wù)棧之上的所有實例鳄逾。
生命周期:創(chuàng)建新的實例會執(zhí)行全部生命周期,如果棧內(nèi)已有實例灵莲,重新打開不會執(zhí)行全部生命周期雕凹,會執(zhí)行onNewIntent()更新參數(shù),

SingleTask下生命周期.png

任務(wù)棧信息:棧內(nèi)復(fù)用政冻,如果已經(jīng)存在實例枚抵,不會重新創(chuàng)建,會復(fù)用之前實例明场,并且會清空同一個任務(wù)棧中的所有實例(關(guān)閉了中間開啟的singleTopActivity)汽摹。

SingleTask模式下任務(wù)棧信息.png

4. SingleInstance單實例模式

說明:只存在一個實例,并且在單的任務(wù)棧中苦锨,并且這個任務(wù)棧有且僅有當(dāng)前一個實例存在逼泣。
生命周期:只會存在一個實例,如果存在不會創(chuàng)建只會會執(zhí)行onNewIntent()復(fù)用當(dāng)前實例舟舒。

singleInstance生命周期.png

任務(wù)棧信息:該實例存在的任務(wù)棧有且僅有一個當(dāng)前實例

SingleInstance任務(wù)棧信息.png

notes

注意onNewIntent()方法中不能使用getIntent()獲取新傳入的數(shù)據(jù)拉庶,如果要使用先使用setIntent(intent)設(shè)置后使用;


    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        Log.e(TAG,"oNewIntent, open : "+TAG);
        setIntent(intent);
    }

二秃励、設(shè)定任務(wù)棧名稱后的啟動模式詳解

在清單文件中單獨設(shè)置任務(wù)棧名稱氏仗,

 <activity
            android:name=".SingleTaskActivity"
            android:taskAffinity="test."
            android:launchMode="singleTask" />

那么啟動的會在新的任務(wù)棧中,新的任務(wù)棧中啟動activity情況如下:
以下分析過程中中將SingleTaskActivity的任務(wù)棧名稱設(shè)置為test.

  1. 啟動standard模式的會在當(dāng)前存在的任務(wù)棧中啟動夺鲜。


    設(shè)定單獨任務(wù)棧名稱后皆尔,default啟動模式任務(wù)棧情況.png
  2. 在SingleInstance實例中啟動standar的模式,會選擇默認任務(wù)棧中創(chuàng)建實例币励。


    SingleInstance中啟動standard實例.png
  3. 啟動singTop任務(wù)棧床佳,仍在默認的任務(wù)棧中。


    指定任務(wù)棧名稱singleTop啟動仍在默認任務(wù)棧中.png
  4. 啟動singleTask榄审,同正常情況一樣。

  5. 啟動SingleInstance同正常情況一樣杆麸,任何情況下都是一個單的任務(wù)棧搁进,即使指定相同的任務(wù)棧名稱也不在同一個任務(wù)棧中。

結(jié)論:

  1. standard模式中昔头,會在當(dāng)前的任務(wù)棧中啟動新的實例饼问,如果當(dāng)前任務(wù)棧中不能創(chuàng)建(例如:當(dāng)前為SingleInstance)那么就會在默認的任務(wù)棧中創(chuàng)建實例。
  2. singleTop揭斧、singleTask如果沒有單獨指定任務(wù)棧名稱莱革,都會在默認的任務(wù)棧中啟動峻堰。即使在新的任務(wù)棧中啟動也不會在新的任務(wù)棧中創(chuàng)建實例。
  3. SingleInstance任何情況都在一個單獨的任務(wù)棧中盅视,并且有且僅有一個實例捐名。

三、不同任務(wù)棧中后退邏輯

  1. 在按返回鍵后退時闹击,會將當(dāng)前的任務(wù)棧中的activity全部退出后镶蹋,再依次退出后續(xù)的任務(wù)棧中的activity。
    同上以下分析過程中將SingleTaskActivity的任務(wù)棧名稱設(shè)置為test.
    返回分析demo.png

    實例中我們設(shè)定DefaultActivity為A ,SingleTopActivity為B赏半,具有單獨任務(wù)棧名稱的singleTaskActivity為C贺归,SingleInstanceActivity為D,
    啟動順序如下:
    A-->B-->A-->C-->A(295在前臺294在后臺)
    此時存在兩個任務(wù)棧分別為:
    1. ID295為singleTask所在任務(wù)棧其中順序為C-->A,
    2. ID294默認任務(wù)棧順序A-->B-->A
    此時再啟動D id為296(294 295任務(wù)棧進入后臺)
    此時存在兩個任務(wù)棧分別為:
    1. 前臺任務(wù)棧ID296只存在一個D
    2. 后臺任務(wù)棧ID295為singleTask所在任務(wù)棧其中順序為C-->A断箫,
    3. 后臺任務(wù)棧ID294默認任務(wù)棧順序A-->B-->A
    此時在啟動B將默認任務(wù)椃骱ǎ回到前臺,存在三個任務(wù)棧
    1. ID294前臺任務(wù)棧其中為A-->B-->A-->B前臺任務(wù)棧
    2. ID296后臺任務(wù)棧其中只有一個D
    3. ID295后臺任務(wù)棧順序C-->A
    此時逐級返回順序為:
    逐級退出生命周期方法.png

B-->A-->B-->A-->D-->A-->C
結(jié)論:在逐級返回中仲义,現(xiàn)將當(dāng)前activity實例所在的任務(wù)棧中的實例全部返回后婶熬,在按照任務(wù)棧的順序逐一退出各個任務(wù)棧中的activity實例。
以上實例代碼地址:https://github.com/Jhonzhou/LanuchModeDemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末光坝,一起剝皮案震驚了整個濱河市尸诽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盯另,老刑警劉巖性含,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鸳惯,居然都是意外死亡商蕴,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門芝发,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绪商,“玉大人,你說我怎么就攤上這事辅鲸「裼簦” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵独悴,是天一觀的道長例书。 經(jīng)常有香客問我,道長刻炒,這世上最難降的妖魔是什么决采? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮坟奥,結(jié)果婚禮上树瞭,老公的妹妹穿的比我還像新娘拇厢。我一直安慰自己,他們只是感情好晒喷,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布孝偎。 她就那樣靜靜地躺著,像睡著了一般厨埋。 火紅的嫁衣襯著肌膚如雪邪媳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天荡陷,我揣著相機與錄音雨效,去河邊找鬼。 笑死废赞,一個胖子當(dāng)著我的面吹牛徽龟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播唉地,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼据悔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了耘沼?” 一聲冷哼從身側(cè)響起极颓,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎群嗤,沒想到半個月后菠隆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡狂秘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年骇径,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片者春。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡破衔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钱烟,到底是詐尸還是另有隱情晰筛,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布拴袭,位于F島的核電站读第,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏稻扬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一羊瘩、第九天 我趴在偏房一處隱蔽的房頂上張望泰佳。 院中可真熱鬧盼砍,春花似錦、人聲如沸逝她。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽黔宛。三九已至近刘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間臀晃,已是汗流浹背觉渴。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留徽惋,地道東北人案淋。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像险绘,于是被迫代替她去往敵國和親踢京。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344