task容器任務(wù)棧
- 當用戶點擊某個應(yīng)用程序圖標打開一個應(yīng)用時,那么這個任務(wù)就處于前端。如果這個應(yīng)用程序之前未被打開過,就會創(chuàng)建一個新的任務(wù)Task。
- Task是一個Activities的收集器,專門收集用戶操作交互所打開的Activity。這些Activities都被安排在一個回收棧back stack中,安排的順序和它們打開的順序一致。即先打開的安排在最底部,最后一個打開的安排在頂部。
運行模式介紹
你可以通過定義運行模式來定義Activities如何與Task進行交互。定義的兩種方式如下:
- 使用manifest配置文件
- 使用intent的標識
例子:Activity A 啟動 Activity B。如果B在manifest中定義了運行模式,并且A在啟動B時,也在Intent中指定了B的運行模式,那么A在Intent的定義將覆蓋B在manifest中的定義。
注:有些運行模式在manifest中定義有效未必在Intent中也有效,同樣,在Intent定義有效的運行模式在manifest中未必生效。
Activity的launchMode屬性來指定4中不同的運行模式
Standard:標準默認模式
在這種默認模式下,Activity可以被多次實例化,也可以運行在多個Task中,一個Task可以擁有多個Activity實例。
singleTop
在這種模式下,如果一個Activity實例已經(jīng)存在于當前Task的最頂部,那么系統(tǒng)將調(diào)用onNewIntent()方法路由到這個實例,而不是創(chuàng)建一個新的Activity實例。
一個Activity可以被實例化多次,且可以從屬于不同的Task任務(wù),且一個任務(wù)中可以存在多個Activity實例(這情況僅僅存在于Activity實例不在Task任務(wù)的頂端)。
A-B-C-D:再開啟D,back stack中的情形:
在標準模式下,則為 A-B-C-D-D
在singleTop模式,則為A-B-C-D
如果開啟B
則在singleTop模式下為 A-B-C-D-B
singTask
這種模式下,系統(tǒng)創(chuàng)建一個新的Task,并在Task的底部實例化Activities。然而,當一個實例存在于一個獨立的Task時,系統(tǒng)不是去創(chuàng)建一個新的實例,而是調(diào)用onNewIntent()路由到其他任務(wù)的實例。在同一時間,只存在一個Activity實例。
singInstance
于singTask相似,唯獨一點不同的是,這個實例只能在一個單獨的Task中使用。
如何使用Intent配置管理
在啟動Activity時,你可以通過傳遞一個Intent入?yún)⒔ostartActivity()方法,來實現(xiàn)與manifest配置類似功能,改變Activity在task中的行為。
FLAG_ACTIVITY_NEW_TASK
和 singleTask 一樣FLAG_ACTIVITY_SINGLE_TOP
和singleTop一樣FLAG_ACTIVITY_CLEAR_TOP
這個模式是沒有屬性配置支持的。在這種模式下,如果啟動一個已經(jīng)存在于當前Task任務(wù)的Activity,那么Task頂部所有的Activity將被銷毀,并且為將要啟動的Activity新建一個Activity實例,存放在task的back stack的頂部。FLAG_ACTIVITY_CLEAR_TOP通常與FLAG_ACTIVITY_NEW_TASK一起結(jié)合使用,
結(jié)合使用可以達到這樣的效果:找到在其他Task中存在的Activity,并將它放置到一個可以相應(yīng)Intent的地方。如果是standard模式,那么它將從stack移除,并新建一個Activity去相應(yīng)Intent,因為這種模式下,總是新建Activity。