Activity调用栈的分析
生活随笔
收集整理的這篇文章主要介紹了
Activity调用栈的分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
生活本來就不容易啊,而我們的不努力只會讓生活變得更加無賴。
今天看了*《Android群英傳》*的有關Activity調用棧的相關知識,所以得來寫點東西記錄今天的收獲。
- 回想當初學習*《第一行代碼》*的時候也看到過這圖,號稱開始那幾年Android面試必問的知識點,所以po上來表示膜拜。下面入正題: Android的調用棧 Android是利用數據結構中的棧來管理Activity的,利用棧是因為它的后進先出(Last In First Out)特性可以在正常情況下良好的管理和決定Activity的狀態。 比如當一個ActivityA啟動另一個ActivityB時,ActivityB處于活動狀態,而ActivityA被壓在棧底,處于停止狀態。當用戶按下Back鍵或者調用finish()方法后,ActivityA重新處于活動狀態進行交互這么一種“和諧”的狀態。但是,并不是所有的Activity都這么“和諧”。所以Google提供了幾種“特權”讓Activity有權力!賦予Activity的權力可以通過AndoridMainifest的android:launchMode屬性或者直接通過Intent兩種方式。
AndroidMainifest啟動模式
- standard
- singleTop
- singleTask
- singleInstance
- 系統會判斷棧頂Activity是否為所需Activity,是則直接引用,否則新建。(QQ接收信息時,如果在此界面接收到多條信息,直接引用而非new多次實例)
- 棧頂ActivityA接收請求需啟動ActivityA,則只會調用其onNewIntent()方法。
- 這種模式與singleTop類似,但此模式是查找整個Activity棧(同一任務棧)是否存在所需Activity,存在則將其后壓棧的Activity全部銷毀致使目標Activity位于棧頂(可以利用這種模式,用來退出整個應用。將主Activity設置為singleTask模式,在需要退出的Activity跳轉到主Activity,將任務棧清空,利用主Activity中的onNewIntent()方法中調用finish()即退出)。
- 當處于不同任務棧的Activity被啟動時,將把其整個任務棧引入,當按下back鍵時,需退出這個任務棧所有Activity時才能對原任務棧進行操作(如下圖)。
書上說這種模式,會新建一個任務棧。其原理與瀏覽器的工作原理相類似。多個程序訪問瀏覽器時。如果瀏覽器已開則直接訪問,沒有則打開瀏覽器后訪問。 singleTop與singleInstance還有一點需注意:如果ActivityA中調用startActivityForResult()啟動另外一個時,系統會自動返回Activity.RESULT_CACELED而不會再等待返回。
Intent Flag啟動模式
清空任務棧
- clearTaskOnLaunch(每次返回該Activity時,其Activity上的Activity全部銷毀)
- finishOnTaskLaunch(離開所在的Activity棧,后返回此Activity被finifh()掉)
- alwaysRetainTaskState (“免死金牌”,當Activity的此屬性設置為true,不接受任何銷毀命令)
**總結:**其實網上這些文章有很多而且寫的很透徹,例如老羅的啊,但是自己寫下來感覺會不一樣。
總結
以上是生活随笔為你收集整理的Activity调用栈的分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: rman备份恢复总结
- 下一篇: 32.3. redis-cli - Co