Android Activity的啟動(dòng)模式

基本概念

一般來(lái)說(shuō)姥闪,Task指的是與用戶交互的Activity的集合,這些Activity集合按照打開(kāi)的順序被放置在同一個(gè)棧中堵腹,這個(gè)棧叫做Back Stack(后退棧)涵防。
   Task是可以跨應(yīng)用的,這正是Task存在的一個(gè)重要原因亡电。有的Activity届巩,雖然不在同一個(gè)app中,但為了保持用戶操作的連貫性份乒,把他們放在同一個(gè)任務(wù)中恕汇。例如,在我們的應(yīng)用中的一個(gè)ActivityA中點(diǎn)擊發(fā)送郵件或辖,會(huì)啟動(dòng)郵件程序的一個(gè)ActivityB來(lái)發(fā)送郵件瘾英,這兩個(gè)Activity是存在于不同app中的,但是被系統(tǒng)放在一個(gè)任務(wù)中颂暇,這樣當(dāng)發(fā)送完郵件后缺谴,用戶按back鍵返回,可以返回到原來(lái)的ActivityA中耳鸯,這樣就確保了用戶體驗(yàn)湿蛔。
  每個(gè)Task都存在一個(gè)Back Stack,而系統(tǒng)中可以存在多個(gè)Task片拍,但是每次只有一個(gè)Task獲得前臺(tái)焦點(diǎn)煌集,一般而言,系統(tǒng)允許用戶在多個(gè)Task中切換捌省,而被至于后臺(tái)的Task中的Activity苫纤,將被置于Stopped狀態(tài)。實(shí)際上纲缓,同一個(gè)Task中的Activity卷拘,只要不存在于棧頂并且獲得前臺(tái)焦點(diǎn)的Activity,那么它就是一個(gè)Stopped的狀態(tài)祝高。下圖為官方文檔中關(guān)于Task前后臺(tái)的示例圖:

Tow Task.png

Activity四種啟動(dòng)模式

standard

標(biāo)準(zhǔn)模式栗弟,也是Activity默認(rèn)啟動(dòng)模式。如果某個(gè)Activity使用該LaunchMode工闺, 當(dāng)這個(gè)Activity啟動(dòng)時(shí)乍赫,系統(tǒng)會(huì)創(chuàng)建一個(gè)該Activity新的實(shí)例瓣蛀,并且傳遞 一個(gè)intent給它。該 Activity可以被實(shí)例化多次雷厂,各個(gè)實(shí)例可以屬于不同的Task惋增,一個(gè)Task 中也可以存在多個(gè)實(shí)例。

singleTop

singleTop其實(shí)和standard幾乎一樣改鲫,使用singleTop的Activity也可以創(chuàng)建很多個(gè)實(shí)例诈皿。唯一不同的就是,如果調(diào)用的目標(biāo)Activity已經(jīng)位于調(diào)用者的Task的棧頂像棘,則不創(chuàng)建新實(shí)例稽亏,而是使用當(dāng)前的這個(gè)Activity實(shí)例,并調(diào)用這個(gè)實(shí)例的onNewIntent方法缕题。

singleTask

singleTask這個(gè)模式和前面提到的standard和singleTop截然不同截歉。使用singleTask啟動(dòng)模式的Activity在系統(tǒng)中只會(huì)存在一個(gè)實(shí)例。如果這個(gè)實(shí)例已經(jīng)存在烟零,intent就會(huì)通過(guò)onNewIntent傳遞到這個(gè)Activity怎披。否則新的Activity實(shí)例被創(chuàng)建。
  同一應(yīng)用
  如果系統(tǒng)中不存在singleTask Activity的實(shí)例瓶摆,那么就需要?jiǎng)?chuàng)建這個(gè)Activity的實(shí)例,并且將這個(gè)實(shí)例放入和調(diào)用者相同的Task中并位于棧頂性宏。
  如果singleTask Activity實(shí)例已然存在群井,那么在Activity回退棧中,所有位于該Activity上面的Activity實(shí)例都將被銷毀掉(銷毀過(guò)程會(huì)調(diào)用Activity生命周期回調(diào))毫胜,這樣使得singleTask Activity實(shí)例位于棧頂书斜。與此同時(shí),Intent會(huì)通過(guò)onNewIntent傳遞到這個(gè)SingleTask Activity實(shí)例酵使。
  跨應(yīng)用
  在跨應(yīng)用Intent傳遞時(shí)荐吉,如果系統(tǒng)中不存在singleTask Activity的實(shí)例,那么講創(chuàng)建一個(gè)新的Task口渔,然后創(chuàng)建SingleTask Activity的實(shí)例样屠,將其放入新的Task中。
  如果singleTask Activity所在的應(yīng)用進(jìn)程存在缺脉,但是singleTask Activity實(shí)例不存在痪欲,那么從別的應(yīng)用啟動(dòng)這個(gè)Activity,新的Activity實(shí)例會(huì)被創(chuàng)建攻礼,并放入到所屬進(jìn)程所在的Task中业踢,并位于棧頂位置。
  更復(fù)雜的一種情況礁扮,如果singleTask Activity實(shí)例存在知举,從其他程序被啟動(dòng)瞬沦,那么這個(gè)Activity所在的Task會(huì)被移到頂部,并且在這個(gè)Task中雇锡,位于singleTask Activity實(shí)例之上的所有Activity將會(huì)被正常銷毀掉逛钻。如果我們按返回鍵,那么我們首先會(huì)回退到這個(gè)Task中的其他Activity遮糖,直到當(dāng)前Task的Activity回退棧為空時(shí)绣的,才會(huì)返回到調(diào)用者的Task。

singleInstance

這個(gè)模式和singleTask差不多欲账,因?yàn)樗麄冊(cè)谙到y(tǒng)中都只有一份實(shí)例屡江。唯一不同的就是存放singleInstance Activity實(shí)例的Task只能存放一個(gè)該模式的Activity實(shí)例。如果從singleInstance Activity實(shí)例啟動(dòng)另一個(gè)Activity赛不,那么這個(gè)Activity實(shí)例會(huì)放入其他的Task中惩嘉。同理,如果singleInstance Activity被別的Activity啟動(dòng)踢故,它也會(huì)放入不同于調(diào)用者的Task中文黎。

<p>

參考

深入講解Android中Activity launchMode
Activity啟動(dòng)模式 及 Intent Flags 與 棧 的關(guān)聯(lián)分析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市殿较,隨后出現(xiàn)的幾起案子耸峭,更是在濱河造成了極大的恐慌,老刑警劉巖淋纲,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件劳闹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡洽瞬,警方通過(guò)查閱死者的電腦和手機(jī)本涕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)伙窃,“玉大人菩颖,你說(shuō)我怎么就攤上這事∥希” “怎么了晦闰?”我有些...
    開(kāi)封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)产场。 經(jīng)常有香客問(wèn)我鹅髓,道長(zhǎng),這世上最難降的妖魔是什么京景? 我笑而不...
    開(kāi)封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任窿冯,我火速辦了婚禮,結(jié)果婚禮上确徙,老公的妹妹穿的比我還像新娘醒串。我一直安慰自己执桌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布芜赌。 她就那樣靜靜地躺著仰挣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缠沈。 梳的紋絲不亂的頭發(fā)上膘壶,一...
    開(kāi)封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天,我揣著相機(jī)與錄音洲愤,去河邊找鬼颓芭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛柬赐,可吹牛的內(nèi)容都是我干的亡问。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼肛宋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼州藕!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起酝陈,我...
    開(kāi)封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤床玻,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后沉帮,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體笨枯,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年遇西,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片严嗜。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡粱檀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出漫玄,到底是詐尸還是另有隱情茄蚯,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布睦优,位于F島的核電站渗常,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏汗盘。R本人自食惡果不足惜皱碘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望隐孽。 院中可真熱鬧癌椿,春花似錦健蕊、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至都办,卻和暖如春嫡锌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背琳钉。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工势木, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人槽卫。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓跟压,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親歼培。 傳聞我的和親對(duì)象是個(gè)殘疾皇子震蒋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容