Activity调用栈的分析
生活随笔
收集整理的這篇文章主要介紹了
Activity调用栈的分析
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
生活本來就不容易啊,而我們的不努力只會讓生活變得更加無賴。
今天看了*《Android群英傳》*的有關(guān)Activity調(diào)用棧的相關(guān)知識,所以得來寫點東西記錄今天的收獲。
- 回想當(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
- 系統(tǒng)會判斷棧頂Activity是否為所需Activity,是則直接引用,否則新建。(QQ接收信息時,如果在此界面接收到多條信息,直接引用而非new多次實例)
- 棧頂ActivityA接收請求需啟動ActivityA,則只會調(diào)用其onNewIntent()方法。
- 這種模式與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ù)棧進行操作(如下圖)。
書上說這種模式,會新建一個任務(wù)棧。其原理與瀏覽器的工作原理相類似。多個程序訪問瀏覽器時。如果瀏覽器已開則直接訪問,沒有則打開瀏覽器后訪問。 singleTop與singleInstance還有一點需注意:如果ActivityA中調(diào)用startActivityForResult()啟動另外一個時,系統(tǒng)會自動返回Activity.RESULT_CACELED而不會再等待返回。
Intent Flag啟動模式
清空任務(wù)棧
- clearTaskOnLaunch(每次返回該Activity時,其Activity上的Activity全部銷毀)
- finishOnTaskLaunch(離開所在的Activity棧,后返回此Activity被finifh()掉)
- alwaysRetainTaskState (“免死金牌”,當(dāng)Activity的此屬性設(shè)置為true,不接受任何銷毀命令)
**總結(jié):**其實網(wǎng)上這些文章有很多而且寫的很透徹,例如老羅的啊,但是自己寫下來感覺會不一樣。
總結(jié)
以上是生活随笔為你收集整理的Activity调用栈的分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: rman备份恢复总结
- 下一篇: 32.3. redis-cli - Co