Activity調(diào)用棧的分析

生活本來就不容易啊,而我們的不努力只會讓生活變得更加無賴。

今天看了《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)力可以通過AndoridMainifestandroid:launchMode屬性或者直接通過Intent兩種方式。

AndroidMainifest啟動模式

  • standard
  • singleTop
  • singleTask
  • singleInstance
  1. standard
    Activity默認的啟動模式,每次創(chuàng)建Activity都會new出一個新的實例。如下圖:


    standard
  2. singleTop
  • 系統(tǒng)會判斷棧頂Activity是否為所需Activity,是則直接引用,否則新建。(QQ接收信息時,如果在此界面接收到多條信息,直接引用而非new多次實例)
  • 棧頂ActivityA接收請求需啟動ActivityA,則只會調(diào)用其onNewIntent()方法。
  1. 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
  1. singleInstance
    書上說這種模式,會新建一個任務(wù)棧。其原理與瀏覽器的工作原理相類似。多個程序訪問瀏覽器時。如果瀏覽器已開則直接訪問,沒有則打開瀏覽器后訪問。
    singleTop與singleInstance還有一點需注意:如果ActivityA中調(diào)用startActivityForResult()啟動另外一個時,系統(tǒng)會自動返回Activity.RESULT_CACELED而不會再等待返回。

Intent Flag啟動模式

  1. Intent.FLAG_ACTIVITY_SINGLE_TOP(singleTop效果相同)
  2. Intent.FLAG_ACTIVITY_CLEAR_TOP(singleTask效果相同)
  3. 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)上這些文章有很多而且寫的很透徹,例如老羅的啊,但是自己寫下來感覺會不一樣。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容