Activity啟動模式探索

Activity使我們在開發(fā)中最常用到的組件凡纳,除了坑爹的生命周期他的啟動模式也是很重要的一個知識點燥筷。
Activity 一共有四種啟動模式刁卜,分別為:standard蠢正,singleTop闯割,singleTask彻消,singleInstance。一下分別討論著四種啟動模式的異同和使用場景宙拉。

standard

standard是系統(tǒng)默認的啟動模式宾尚,他的特點是每次啟動Activity都會創(chuàng)建一個新的Activity實例。每個新的Activity既可以存在于同一個任務棧也可以存在于不同的任務棧下(任務棧接下來會淺談)谢澈,誰啟動了這個standard模式的Activity煌贴,這個Activity就是出現在誰的棧內(singleInstance下令做討論)。如果用ABCD的代表四個Activity的話我們啟動了順序A-B-C這個時候又啟動了B那么棧內就會有ABCB四個Activity實例锥忿。ABCD在下文中代表四個Activity

singleTop

該模式下分類討論牛郑,
①該Activity已經存在:
a.該Activity已經位于棧頂:這個Activity就不會被重新創(chuàng)建,并且會調用onNewIntent方法敬鬓。舉例說明淹朋,我們啟動了ABCD四個Acitivity笙各,這個時候D位于棧頂,并且D是singleTop模式础芍,這個時候在D內重新啟動D任務棧內結構仍為ABCD杈抢,但是這個時候D的onCreate,onStart不會被調用者甲,onNewIntent被系統(tǒng)調起春感,我們可以再onNewIntent里面處理相關的信息。
b.該Activity不在棧頂:直接舉例說明虏缸,C為singleTop模式,其他的為standar模式嫩实,棧內存在ABDC刽辙,C在棧頂,這個時候再去啟動D就會重新創(chuàng)建一個新的Activity甲献,棧內存在ABDCD五個Activity宰缤。
②該Activity不存在
會創(chuàng)建一個新的位于棧頂的Activity,其他同上晃洒。

singleTask

一個App不一定是只有一個任務棧干到死的慨灭,可能存在多個任務棧,而在singleTask模式的Activity只會存在一個棧內球及,分類討論如下:
①該Activity在所在的棧都不存在:
創(chuàng)建一個新的棧然后將新Activity壓入棧內氧骤。
②該Activity所在的任務棧存在:
a.棧在Activity不存在:創(chuàng)建新的Activity并壓入棧內。
b.棧在Activity也存在:
1.該Activity在棧頂:Activity喚起并調用onNewIntent吃引。
2.該Acitivity不在棧頂:該Activity被調至棧頂并調用onNewIntent筹陵。
注意:棧的結構是先進后出的,所謂的調至棧頂就是清空該Activity上面的Activity使用其暴露在頂部镊尺。(好黑暗/(ㄒoㄒ)/~~)
(上面提到的Acitivity所在的棧會在討論完這四種模式后討論)

好吧朦佩,顯然這個singleTask模式是為處女座準備的。

舉個栗子:棧S1存在ABC 庐氮,在C內啟動singleTask模式的D语稠,D所在的棧應該為S2,好了弄砍,開始套公式(敲黑板)仙畦,
如果S2不存在,創(chuàng)建S2输枯,并在S2內創(chuàng)建新的D议泵;
如果S2存在,里面已經有了EF就是沒有D桃熄,那么創(chuàng)建D掺涛,并壓入S2棧頂耿戚;
如果S2存在误窖,里面有了DEF,猥瑣的D蹲在正好棧底部厢汹,那么D上面的EF就會被趕出S2棧,使D出現在棧頂谐宙,并調用D的onNewIntent方法烫葬。

綜上所述:singleTask是一個任務棧內復用的模式。

PS:啟動一個新的任務棧的singleTaskActivity系統(tǒng)動畫會和standard模式下一鍵跳轉不一樣凡蜻。不知道是不是系統(tǒng)的問題搭综,還是Android對于任務棧就是這么定義的。

singleInstance

顧名思義划栓,單例模式...
這種模式下和上述的singleTask很接近兑巾,唯一不一樣的是,在singleTask模式下的Activity是允許大家住一間屋的忠荞,但是它有事的時候你們都得讓路蒋歌,它是不會重建的。而這個singleInstance模式的Activity簡直就是混蛋的孤家寡人委煤,它不允許它住的屋子里面有人...也就是說singleInstance自己擁有一個任務棧堂油,棧內只有他自己。

我們上面提到在standard之下跳轉碧绞,在哪個棧內跳轉就standard模式的Activity就會出現的誰的棧內府框,但是基于上面singleInstance的孤家寡人理論這兩個顯然是矛盾的,本著知行合一头遭,做一個實現寓免,新建ABC三個Activity,C為singleTask计维,A->B->C 然后繼續(xù)跳轉到A袜香,這個是時候back,會發(fā)現顯示了B鲫惶,并沒有顯示C蜈首,接著back會顯示A,再BACK顯示C欠母,在C就退出應用了欢策。而且在C相鄰Activity會明顯發(fā)現動畫不一樣。

這是我們看到的情況赏淌,接下來我們用 abd shell dumpsys activity命令踩寇,找到輸出

TaskRecord{85124cb #1461 A=com.maomibox.myapplication U=0 StackId=1 sz=3}
        Run #16: ActivityRecord{7733e23 u0 com.maomibox.myapplication/.A t1461}
TaskRecord{e348f76 #1462 A=com.maomibox.myapplication U=0 StackId=1 sz=1}
        Run #15: ActivityRecord{6c5074a u0 com.maomibox.myapplication/.C t1462}
TaskRecord{85124cb #1461 A=com.maomibox.myapplication U=0 StackId=1 sz=3}
        Run #14: ActivityRecord{8047354 u0 com.maomibox.myapplication/.B t1461}
        Run #13: ActivityRecord{9e18691 u0 com.maomibox.myapplication/.A t1461}

會發(fā)現id為85124cb只有ABAAcitivity,C存在于 id為e348f76 的棧內六水,也就是說C所在的棧內是有他自己俺孙,A也并沒有像上文說的standard一樣出現在C所在的棧內辣卒。在棧85124cb全部退出后,執(zhí)行e348f76 棧的退出睛榄,最終退出應用荣茫。

啥是任務棧

上面提到了那么多任務棧,這個任務棧是啥场靴?
棧是一種先進后出的結構啡莉,任務棧就是存放Activity的地方,standard模式下只有一個任務棧旨剥,而在singleTask模式下并搭配上taskAffinity屬性則會新開一個任務棧咧欣,singleInstance自帶Buff,自己會創(chuàng)建一個任務棧泞边,如果在singleTask下不指定taskAffinity那么就相當于啥都沒做该押,還是在默認棧內。給activity指定任務棧如下

        <activity android:name=".C"
            android:launchMode="singleInstance" 
            android:taskAffinity="com.demo.c"/>

上文提到的“所在的椪笱瑁”就是這個com.demo.c,C就運行在這個棧內烟具。
taskAffinity屬性和signleTask啟動模式或者和allowTaskReparenting搭配才有用沒其他情況下毛用沒有(有待驗證)梢什。

Activity FLAGS

Activity的Flag很多,Intent.FLAG_ACTIVITY_ IDE會聯想出來很多朝聋,列舉幾個常用的如下:
FLAG_ACTIVITY_NEW_TASK
同singleTask
FLAG_ACTIVITY_SINGLE_TOP
同singleTop
FLAG_ACTIVITY_CLEAR_TOP
該FLAG下同FLAG_ACTIVITY_NEW_TASK搭配下和之前將的清光棧暴露Acitivity類似嗡午。

使用場景(本段來自互聯網)自己體會吧...

standard: 適合多個實例存在的情況,比如冀痕,發(fā)郵件頁面荔睹。
singleTop: 適合接收通知內容顯示頁面。例如言蛇,某些應用會為用戶推送一些消息通知僻他,當用戶從任務欄中進入查看消息內容界面時,如果設置為singleTop時腊尚,這樣每次行為都使用同一個實例吨拗,用戶點擊返回時不會存在多個消息頁面的情況。
singleTask: 適合使用在一個程序的主界面婿斥。
singleInstance: 使用較少劝篷,比如一些launchAPP可能會使用到。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末民宿,一起剝皮案震驚了整個濱河市娇妓,隨后出現的幾起案子,更是在濱河造成了極大的恐慌活鹰,老刑警劉巖哈恰,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件只估,死亡現場離奇詭異,居然都是意外死亡蕊蝗,警方通過查閱死者的電腦和手機仅乓,發(fā)現死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蓬戚,“玉大人夸楣,你說我怎么就攤上這事∽愉觯” “怎么了豫喧?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長幢泼。 經常有香客問我紧显,道長,這世上最難降的妖魔是什么缕棵? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任孵班,我火速辦了婚禮,結果婚禮上招驴,老公的妹妹穿的比我還像新娘篙程。我一直安慰自己,他們只是感情好别厘,可當我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布虱饿。 她就那樣靜靜地躺著,像睡著了一般触趴。 火紅的嫁衣襯著肌膚如雪氮发。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天冗懦,我揣著相機與錄音爽冕,去河邊找鬼。 笑死批狐,一個胖子當著我的面吹牛扇售,可吹牛的內容都是我干的。 我是一名探鬼主播嚣艇,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼承冰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了食零?” 一聲冷哼從身側響起困乒,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贰谣,沒想到半個月后娜搂,有當地人在樹林里發(fā)現了一具尸體迁霎,經...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年百宇,在試婚紗的時候發(fā)現自己被綠了考廉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡携御,死狀恐怖昌粤,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情啄刹,我是刑警寧澤涮坐,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站誓军,受9級特大地震影響袱讹,放射性物質發(fā)生泄漏。R本人自食惡果不足惜昵时,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一捷雕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧壹甥,春花似錦非区、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽久橙。三九已至俄占,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間淆衷,已是汗流浹背缸榄。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留祝拯,地道東北人甚带。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像佳头,于是被迫代替她去往敵國和親鹰贵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內容