Android的進階學習(二)--Activity的啟動模式

好久以前就知道androidActivity有不同的啟動方式,但開始始終沒有弄明白,現(xiàn)在終于梳理清了。

任務棧

Activity一共有四種不同的啟動模式,分別是standard 余佃、singleTopsingleTask跨算、singleInstance爆土,不同的啟動模式,就讓activity存在于內(nèi)存中不同的任務棧和棧里的位置诸蚕。這里我們提到了一個任務棧步势,其實就是一個后進先出的容器,里面存放著Activity背犯。

任務棧.png

在這樣一個任務棧里面坏瘩,相當于先讓Activity_A進棧(直接啟動Activity_A),然后再讓Activity_B進棧(從Activity_A以某種模式啟動Activity_B,具體什么方式后面就講),剩下的Activity_C漠魏、Activity_D也是按照這種方式進棧倔矾。然后就是出棧了,首先我們明白現(xiàn)在的任務棧中有4個Activity柱锹,接著當我們按手機的back鍵的時候哪自,就會按照D,C,B,A出棧,這也就是所說的先進后出禁熏。當然办铡,屏幕顯示的就是棧頂?shù)脑亓恕?/p>

四種啟動模式

一.standard (標準模式)

standard字面意思就是標準叶骨,沒錯漫试,就是標準模式蛾号。當Activity以標準模式啟動的時候锌蓄,就會把該Activity給放入棧頂升筏。沒錯,我們上面的例子就可以用standard模式啟動瘸爽。

二.singleTop(棧頂復用模式)

singleTop模式就是講您访,當我們以singleTop啟動Activity的時候,如果這時候的棧頂元素也是我們的需要啟動的Activity剪决,那么這個Activity就不會再次被創(chuàng)建灵汪,而是回調(diào)onNewIntent 方法檀训。

棧頂復用.png

其實這個還是很好理解的,也就和字面意思一樣享言。好峻凫,我們看上面的任務棧,左邊就是我們開始的樣子(DCBA)览露,然后我們再以singleTop模式去啟動D,然后荧琼,發(fā)現(xiàn)任務棧中還是(DCBA)。這就是棧頂復用模式差牛。

二.singleTask(棧內(nèi)復用模式)

singleTask是我覺得這幾種模式中最難理解的命锄,但是慢慢理一下,發(fā)現(xiàn)還是挺簡單的偏化。
singleTask模式啟動的Activity首先就會尋找自己需要的任務棧脐恩,如果沒有,就會創(chuàng)建一個侦讨,然后把自己給放進棧里面驶冒。要是有發(fā)現(xiàn)自己需要的任務棧,就會看里面有沒有這個Activity的實例搭伤,沒有的話就在棧頂加入新創(chuàng)的實例只怎,要是有的話就會彈出該實例上面的所有元素,從而把所需求的實例給推到棧頂怜俐。
這樣一說身堡,肯定都還是模模糊糊的,不用怕拍鲤,我們慢慢理贴谎。首先,這里我們提出了一個新的術語季稳,"Activity需要的任務棧"擅这。這里我們需要明白,當我們沒有為Activity給指定任務棧的話,那它默認的就是我們項目的包名景鼠。當然仲翎,我們可以為其指定一個任務棧。

<activity
 android:name=".Activity_C"       
android:label="@string/title_activity_activity__c"    
android:taskAffinity="com.mathias.www" 
android:theme="@style/AppTheme.NoActionBar" />

Activity標簽中铛漓,通過taskAffinity(任務相關性)給指定的字符串(字符串中必須包含分割符” . “),這樣當我們以singleTask啟動該Activity的時候溯香,就會新建一個任務棧。但是一般來說我們的Activity都是以默認的taskAffinity啟動的浓恶。

相同的任務棧
棧內(nèi)復用.png

就如上圖一樣玫坛,起初我們的任務棧中有DCBA四個元素,接著包晰,我們以singleTask模式啟動B,那么B就不會被重新創(chuàng)建湿镀,而是回調(diào)onNewIntent方法炕吸,并且,它還會清掉它上面的元素DC(clearTop效果)勉痴,這時候你按back鍵的話就是返回到A赫模。

不同的任務棧
棧內(nèi)復用 (1).png

圖中,我們起初的默認任務棧中有BA兩個元素蒸矛,然后我們以singleTask(不同的任務棧嘴瓤,即改變了taskAffinity)啟動C,那么C就會被放到另一個任務棧中,同時莉钙,由于C在前臺廓脆,所以C屬于的任務棧也會被變成我們的前臺任務棧。
當然磁玉,有些人可能會說停忿,C不在默認的任務棧中了,但是我們按back鍵還是會回到B呀蚊伞?對席赂,當然會回到B。當前臺任務棧返回的是時候棧里已經(jīng)沒有了元素了时迫,所以就會返回到后臺任務棧了颅停。
或許你又會說,那這樣啟動Activity有什么作用嗎掠拳?好吧癞揉,當我們在同一個應用以不同的任務棧啟動的時候,好像這個作用并不大(怪我自己還沒找到)溺欧,但是在一個應用代開另一個應用的時候就起作用了喊熟,當一個應用A打開了另一個應用B的Acctvity后,再返回Home,打開應用B,就發(fā)現(xiàn)B沒有在主界面姐刁,而是開始A打開的界面芥牌,當然這里還需要一個Activity的屬性支持 android:allowTaskReparenting="true"

singleInstance(單實例模式)

所謂的singleInstance模式聂使,首先壁拉,它具備上一個singleTask的所有屬性,其次柏靶,它只能獨自的存在于一個單獨的任務棧弃理。簡單點就是說,當以singleInstance啟動Activity的時候,會為它創(chuàng)建一個新的任務棧宿礁,而且這個任務棧只會有它一個Activity案铺,后續(xù)的請求也都不會再重新創(chuàng)建它了蔬芥,所以叫做單例梆靖。

單實例.png

好吧控汉,我們還是簡單的分析一下(搞什么,圖和上面的一樣):假設我們當前任務棧中有BA,接著我們以singleInstance模式啟動C返吻,那么C就會在一個獨立的任務棧中了姑子,然后我們的請求可能會讓前臺任務棧又變成了默認的(BA),這時候测僵,我們再啟動C,就不會創(chuàng)建C,而是直接把C這個任務棧變成前臺任務棧街佑,顯示C
也許你看過上面的分析又會有疑問了:明明上面的操作用singleTask就能完成,為什么還要用singleInstance?

解析.png

的確捍靠,上面的操作換成singleTask也是可以完成的沐旨,但是看我們這圖里面的情況,BA為默認的任務棧榨婆,C為新建的磁携。這時候,我們啟動一個和C任務棧相同的D,那么這里就會變成DC良风。

解析 (1).png

然后谊迄,我們一系列的操作 ,又讓前臺任務棧變成了BA,我們這時候啟動C,那么由于開始說的clearTop屬性就會把D給清理出去了烟央。再創(chuàng)建D的時候就會重建了统诺,然而,如果使用的是singleInsatnce的話就不會出現(xiàn)這種情況了疑俭,因為singleInstance中只能有一個Activity粮呢。

設置啟動模式

說了這么多,才發(fā)現(xiàn)還沒有講如何設置......
好吧钞艇,設置Activity啟動模式有兩種方法鬼贱,一種就是在AndroidManifest.xmlActivitylaunchMode

<activity  
android:name=".Activity_B" 
android:launchMode="singleInstance"    
android:allowTaskReparenting="true"    
android:label="@string/title_activity_activity__b"    
android:theme="@style/AppTheme.NoActionBar" />

另一種就是在代碼中設置標志符了:

Intent intent = new Intent(Activity_A.this,Activity_B.class);
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);

這兩種方式都可以設置,但是代碼設置的優(yōu)先級肯定是比在xml中高的(在代碼中先解析xml香璃,再設置的)这难。

最后

還有,這些是我參考《Android開發(fā)藝術探索》的葡秒,對姻乓,就是任大大的。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末眯牧,一起剝皮案震驚了整個濱河市蹋岩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌学少,老刑警劉巖剪个,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異版确,居然都是意外死亡扣囊,警方通過查閱死者的電腦和手機乎折,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侵歇,“玉大人骂澄,你說我怎么就攤上這事√杪牵” “怎么了坟冲?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長溃蔫。 經(jīng)常有香客問我健提,道長,這世上最難降的妖魔是什么伟叛? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任矩桂,我火速辦了婚禮,結果婚禮上痪伦,老公的妹妹穿的比我還像新娘侄榴。我一直安慰自己,他們只是感情好网沾,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布癞蚕。 她就那樣靜靜地躺著,像睡著了一般辉哥。 火紅的嫁衣襯著肌膚如雪桦山。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天醋旦,我揣著相機與錄音恒水,去河邊找鬼。 笑死饲齐,一個胖子當著我的面吹牛钉凌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播捂人,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼御雕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了滥搭?” 一聲冷哼從身側響起酸纲,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瑟匆,沒想到半個月后闽坡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年疾嗅,在試婚紗的時候發(fā)現(xiàn)自己被綠了外厂。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡宪迟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出交惯,到底是詐尸還是另有隱情次泽,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布席爽,位于F島的核電站意荤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏只锻。R本人自食惡果不足惜玖像,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望齐饮。 院中可真熱鬧捐寥,春花似錦、人聲如沸祖驱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捺僻。三九已至乡洼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匕坯,已是汗流浹背束昵。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留葛峻,地道東北人锹雏。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像术奖,于是被迫代替她去往敵國和親逼侦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

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