生活本來就不容易啊,而我們的不努力只會讓生活變得更加無賴。
今天看了《Android群英傳》的有關(guān)Activity調(diào)用棧的相關(guān)知識,所以得來寫點東西記錄今天的收獲。

Activity生命周期
- 回想當(dāng)初學(xué)習(xí)《第一行代碼》的時候也看到過這圖,號稱開始那幾年Android面試必問的知識點,所以po上來表示膜拜。下面入正題:
Android的調(diào)用棧
Android是利用數(shù)據(jù)結(jié)構(gòu)中的棧來管理Activity的,利用棧是因為它的后進先出(Last In First Out)特性可以在正常情況下良好的管理和決定Activity的狀態(tài)。
比如當(dāng)一個ActivityA啟動另一個ActivityB時,ActivityB處于活動狀態(tài),而ActivityA被壓在棧底,處于停止?fàn)顟B(tài)。當(dāng)用戶按下Back鍵或者調(diào)用finish()方法后,ActivityA重新處于活動狀態(tài)進行交互這么一種“和諧”的狀態(tài)。但是,并不是所有的Activity都這么“和諧”。所以Google提供了幾種“特權(quán)”讓Activity有權(quán)力!賦予Activity的權(quán)力可以通過AndoridMainifest的android:launchMode屬性或者直接通過Intent兩種方式。
AndroidMainifest啟動模式
- standard
- singleTop
- singleTask
- singleInstance
-
standard
Activity默認的啟動模式,每次創(chuàng)建Activity都會new出一個新的實例。如下圖:
standard - singleTop
- 系統(tǒng)會判斷棧頂Activity是否為所需Activity,是則直接引用,否則新建。(QQ接收信息時,如果在此界面接收到多條信息,直接引用而非new多次實例)
- 棧頂ActivityA接收請求需啟動ActivityA,則只會調(diào)用其onNewIntent()方法。
- singleTask
- 這種模式與singleTop類似,但此模式是查找整個Activity棧(同一任務(wù)棧)是否存在所需Activity,存在則將其后壓棧的Activity全部銷毀致使目標(biāo)Activity位于棧頂(可以利用這種模式,用來退出整個應(yīng)用。將主Activity設(shè)置為singleTask模式,在需要退出的Activity跳轉(zhuǎn)到主Activity,將任務(wù)棧清空,利用主Activity中的onNewIntent()方法中調(diào)用finish()即退出)。
-
當(dāng)處于不同任務(wù)棧的Activity被啟動時,將把其整個任務(wù)棧引入,當(dāng)按下back鍵時,需退出這個任務(wù)棧所有Activity時才能對原任務(wù)棧進行操作(如下圖)。
Paste_Image.png
- singleInstance
書上說這種模式,會新建一個任務(wù)棧。其原理與瀏覽器的工作原理相類似。多個程序訪問瀏覽器時。如果瀏覽器已開則直接訪問,沒有則打開瀏覽器后訪問。
singleTop與singleInstance還有一點需注意:如果ActivityA中調(diào)用startActivityForResult()啟動另外一個時,系統(tǒng)會自動返回Activity.RESULT_CACELED而不會再等待返回。
Intent Flag啟動模式
- Intent.FLAG_ACTIVITY_SINGLE_TOP(singleTop效果相同)
- Intent.FLAG_ACTIVITY_CLEAR_TOP(singleTask效果相同)
- Intent.FLAG_ACTIVITY_NO_HISTORY(該模式下,ActivityA啟動ActivityB后,ActivityA小時)
清空任務(wù)棧
- clearTaskOnLaunch(每次返回該Activity時,其Activity上的Activity全部銷毀)
- finishOnTaskLaunch(離開所在的Activity棧,后返回此Activity被finifh()掉)
- alwaysRetainTaskState (“免死金牌”,當(dāng)Activity的此屬性設(shè)置為true,不接受任何銷毀命令)
總結(jié):其實網(wǎng)上這些文章有很多而且寫的很透徹,例如老羅的啊,但是自己寫下來感覺會不一樣。

