Activity學(xué)習(二):啟動模式 和 任務(wù)棧

Activity學(xué)習第二篇

1. LaunchMode

再簡單的東西也需要認真對待。

Activity的四中啟動模式:

  1. standard:標準模式(默認)
  2. singleTop: 棧頂復(fù)用模式
  3. singleTask:棧內(nèi)復(fù)用模式
  4. singleInstance:單實例模式

首先是 standard ,這是系統(tǒng)默認的啟動模式。
當我們啟動新的Activity時候,是調(diào)用 ContextstartActivity() 方法。
但是,如果這個Context不是Activity類型而是ApplicationContext。那這時候會報錯,無法啟動。因為在standard模式下,是在當前Activity的所屬任務(wù)棧中啟動新的Activity,如果這個Context不是Activity類型的話,那么就不存在所謂的Activity任務(wù)棧了,報錯也就理所當然了。所以這個時候可以配置 ** Flag (FLAG_ACTIVITY_NEW_TASK)**,這時候?qū)嶋H上以singleTask模式啟動。在新的任務(wù)棧中啟動Activity。這樣,就可以使用ApplicationContext啟動Activity。?乛?乛?

再看singleTop,如果這個Activity已經(jīng)存在于這個棧的棧頂,那么就會復(fù)用這個Activity,不會重新創(chuàng)建新的Activity。這個時候Activity 的onCreate() 和 onStart() 不會被調(diào)用。但是會有另一個方法 onNewIntent() 方法被調(diào)用。當配置了singleTop的Activity處于棧頂,又再次被啟動的時候,調(diào)用如下:

然后是singleTask 棧內(nèi)復(fù)用。這種模式下,只要Activity在 某一個棧內(nèi)(可能存在多個棧) 存在,就回復(fù)用這個Activity,而不會去重新創(chuàng)建。和singleTop一樣,系統(tǒng)也會調(diào)用 onNewIntent() 方法。
這里有幾種情況,首先是請求的棧是本棧還是一個新棧,還有就是Activity存不存在。

現(xiàn)在有個Activity棧,有ABC三個Activity。要創(chuàng)建一個新的Activity D。

1. 本Activity棧 — Activity不存在
這種情況最簡單,創(chuàng)建一個新的Activity,壓入棧中即可。這個棧變成了 ABCD。
2. 本Activity棧 — Activity存在
這是如果本棧的Activity 是 ADBC 這個樣子。然后再使用singleTask模式啟動 D 這個Activity。系統(tǒng)會將D 調(diào)到棧頂,并且調(diào)用D的 onNewIntent() 方法。同時會將D上面的所有Activity清除掉。這時棧變成了 AD。
3. 新Activity棧 — Activity不存在
這個時候需要重新創(chuàng)建因為這個棧不存在,這個Activity也存在,所以這時,系統(tǒng)先創(chuàng)建一個棧,然后再創(chuàng)建一個Activity,再將Activity壓入新棧中。
4. 新Activity棧 — Activity存在
這是最復(fù)雜一種情況。這時候會有一個 后臺棧前臺棧 的概念。
先來分析這種情況,當前Activity肯定處于前臺棧,既然新的Activity要在新的棧中啟動,并且Activity已經(jīng)存在,那么,這個棧肯定已經(jīng)創(chuàng)建完成,并且屬于 后臺棧 。這時,系統(tǒng)會先將整個任務(wù)棧調(diào)到前臺,然后再按照singleTask 原則,該復(fù)用復(fù)用,該清除清除。這時整個棧中的所有Activity都會被調(diào)到另一個棧之前。所以,一直按Back鍵,回退的Activity順序會有所改變。

最后是 singleInstance 。一種加強型的singleTask。擁有singleTask的所有特性。不同在于,這個模式的Activity會在一個新的獨特的棧中創(chuàng)建Activity,這個棧中只有這個Activity存在。由于棧內(nèi)復(fù)用的特性,所有的這個Activity啟動時都不會重新創(chuàng)建。除非這個獨特的任務(wù)棧被系統(tǒng)殺死。

2. 任務(wù)棧

這里主要說明兩個配置參數(shù) taskAffinityallowTaskReparenting

taskAffinity: 每個Activity都有 taskAffinity 屬性,這個屬性指出了它希望進入的Task。默認情況下,taskAffinity 的值是包名。所以如果你設(shè)置了這個屬性是包名的話,那和沒設(shè)置是一樣的。

<activity android:name=".Act3" 
    android:taskAffinity="com.mytest.task2"/>

如果想要Activity在新的任務(wù)棧中啟動,那么需要兩步:

  1. Manifest中設(shè)置Activity的taskAffinity屬性 。
  2. 在啟動Activity時候需要設(shè)置 FLAG_ACTIVITY_NEW_TASK

在Activity中可以使用 Activity. getTaskId() 方法來獲取當前Task的 ID。驗證自己的猜想。

allowTaskReparenting :這個屬性用于設(shè)定Activity能夠從啟動它的任務(wù)中轉(zhuǎn)移到另一個與啟動它的任務(wù)有親緣關(guān)系的任務(wù)中。

這個親緣關(guān)系只能和根Activity去比較,所以必須在根Activity設(shè)置taskAffinity,而需要轉(zhuǎn)移的Activity不需要是根Activity。

如果設(shè)置了true,則能夠轉(zhuǎn)移,如果設(shè)置了false,則這個Activity保留在啟動它的那個任務(wù)中。
設(shè)置方式:

<activity
      android:name=".Act2"
      android:allowTaskReparenting="true"
      android:taskAffinity="com.mytest.task2" />
<activity
      android:name=".Act1"
      android:taskAffinity="com.mytest.task2"/>

這里比較難理解,舉個例子吧:
現(xiàn)在有兩個應(yīng)用 應(yīng)用A應(yīng)用B
應(yīng)用A 是在前臺的應(yīng)用,應(yīng)用B是后臺應(yīng)用。
應(yīng)用BAct 1Act 2 有相同的taskAffinity。(這樣就具有了親緣關(guān)系)
應(yīng)用BAct 2 配置了android:allowTaskReparenting="true"
現(xiàn)在 應(yīng)用A 啟動應(yīng)用BAct 2
然后回到桌面,啟動應(yīng)用BAct 1
流程如下:


其中,Act 2 這個Activity從應(yīng)用A的棧中,轉(zhuǎn)移到了應(yīng)用B的棧的頂端。

(可以將應(yīng)用BAct 2想象成瀏覽器的網(wǎng)頁界面。其他應(yīng)用打開了網(wǎng)頁。這時打開瀏覽器應(yīng)用,那個打開的網(wǎng)頁處于最前端)

還有其他的一些配置屬性,后續(xù)再寫吧。

Activity學(xué)習(一)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,577評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,486評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,852評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,600評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,944評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,108評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,652評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,385評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,616評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,798評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,205評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,537評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,334評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,570評論 2 379

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