- 更多分享:www.catbro.cn
一、前沿:
- Android 中談到啓動模式,就離不開任務棧Task。
- Android中對Activty存儲的管理與Task息息相關,以下爲個人對Task與啓動模式的小結。
二、Task
- 談到Activity的啓動模式,就會涉及到數據結構中的棧,Android中的任務棧也稱Task,使用棧結構進行實現,具有後進先出的特點,創建一個Activity時,會往Task中壓入一個Actiivty,當Activity銷燬時,又會從Task中將該Activity移除,Task頂部的Activity即爲此時處於可交互狀態的Activity(running狀態)
- 一個Task中可以存儲多個app的Activity,一個App的Activity也可以存儲在不同的Task中
1、 taskAffinity
- 除了launchMode可以用來調配Task,的另一屬性taskAffinity,也是常常被使用。taskAffinity,是一種物以類聚的思想,它傾向於將taskAffinity屬性相同的Activity,扔進同一個Task中。
- TaskAffinity特點如下:
- 1、TaskAffinity參數標識着Activity所需要任務棧的名稱,默認情況下,一個應用中所有的Activity所需要的任務棧名稱都爲改應用的包名。
- 2、taskAffinity的約束力弱於launchMode,只有當中的allowTaskReparen ting設置爲true,抑或是調用方將Intent的flag添加FLAG_ACTIVITY_NEW_TASK屬性時纔會生效,在其他情況下沒有實際意義
- 3、TaskAffinity屬性的值不能與當前應用包名相同,否則其值跟沒有差不多
三、清除Task的三種模式
1、android:clearTaskOnLaunch
- 這個屬性用來標記是否從task清除除根Activity之外的所有的Activity,“true”表示清除,“false”表示不清除,默認爲“false”。
- 這裏有點我們必須要注意的,這個屬性只對任務棧內的root Activity起作用,任務棧內其他的Activity都會被忽略。
- 如果android:clearTaskOnLaunch屬性爲“true”,每次我們重新進入這個應用時,我們只會看到根Activity,任務棧中的其他Activity都會被清除出棧。
2、android:finishOnTaskLaunch
- finishOnTaskLaunch屬性與clearTaskOnLaunch 有些類似,它們的區別是finishOnTaskLaunch是作用在自己身上(把自己移除任務棧,不影響別的Activity),而clearTaskOnLaunch則是作用在別人身上(把別的Activity移除任務棧)
- 如果我們把Activity的android:finishOnTaskLaunch屬性值設置爲true時,離開這個Activity所依賴的任務棧後,當我們重新返回時,該Activity將會被finish掉,而且其他Activity不會受到影響。
3、android:alwaysRetainTaskState
- 如果當前Activity的android:alwaysRetainTaskState設置爲true時,那麼該Activity所在的任務棧將不會受到任何清理命令的影響,一直保持當前任務棧的狀態。
四、Activity的四種啓動模式
1、standard(默認):標準模式
- 每次啓動一個Activity,都會創建一個新的Activity壓入Task中
2、singleTop:棧頂複用模式
- 如果新啓動的activity已經存在有對應類型的實例且處於棧頂,系統此時不會創建新的Activity,而是複用棧頂的activity實例,我們如何判斷是被複用的呢?
- 當被複用時,onNewIntent方法將會被回調。onCreate、onStart不會回調,因爲我們的Activity已經時被創建並且啓動了的,但是onResume還是會回調的哦
3、singleTask:棧內複用模式
- 該模式爲Task棧內單例模式,task內該activity實例只會存在一個
- 當啓動的activity恰好處於top時,行爲與singleTop一樣
- 當啓動activity,但此時該類型的Activity實例並不處於top,此時會將該activity實例頂部的activitys都從task中移除,然後將該activity置於top
- 複用時同樣會回調onNewIntent
4、singleInstance:單Task單例模式
- 此模式下,系統將爲該模式的Activity創建一個單獨的Task,並且該Activity獨享該Task
五、總結
- 從上面的小結中我們可以看出,Android的四種啓動模式的特充分利用了Task本身的特點,理解Task的工作方式更有利於我們理解Android的四種啓動模式