Android Intent.FLAG_NEW_TASK詳解,包括其他的標記的一些解釋
本文大部分參考自 http://blog.csdn.net/mayingcai1987/article/details/6200909 ,對原文中的講解FLAG_NEW_TASK地方加了一些自己的觀點,用紅色標記
1. Task是包含一系列Activity的堆疊, 遵循先進後出原則.
2. Task預設行為:
(1) 前提: Activity A和Activity B在同一個應用中.
操作: Activity A啟動開僻Task堆疊(堆疊狀態: A), 在Activity A中啟動Activity B(堆疊狀態: AB), 按下BACK返回鍵(堆疊狀態: A).
(2) 前提: Activity A和Activity B在同一個應用中, 應用名稱為"TaskOne應用".
操作: 在Launcher中單擊"TaskOne應用"圖示, Activity A啟動開僻Task堆疊, 命名為TaskA(TaskA堆疊狀態: A),
在Activity A中啟動Activity B(TaskA堆疊狀態: AB), 長按Home鍵, 返回Launcher, 啟動其它應用(如:電子書),
開僻一個新Task堆疊, 命名: TaskB, 長按Home健, 返回Launcher, 單擊"TaskOne應用"圖示, 此時TaskA堆疊返回前臺,
Activity B為棧頂應用, 供使用者使用.
(3) 前提: Activity A在名稱為"TaskOne應用"的應用中, Activity C在名稱為"TaskTwo應用"的應用中.
操作: 在Launcher中單擊"TaskOne應用"圖示, Activity A啟動開僻Task堆疊, 命名為TaskA(TaskA堆疊狀態: A),
在Activity A中啟動Activity C(TaskA堆疊狀態: AC),長按Home鍵, 返回Launcher, 啟動"TaskTwo應用"即Activity C,
開僻新的Task堆疊, 命名為TaskB, 按BACK鍵返回Launcher, 單擊"TaskOne應用"圖示, 此時TaskA堆疊返回前臺,
Activity C為棧頂應用, 供使用者使用.
3. Intent FLAG介紹:
(1) FLAG_ACTIVITY_NEW_TASK: 設定此狀態,記住以下原則,首先會查詢是否存在和被啟動的Activity具有相同的親和性的任務棧(即taskAffinity,注意同一個應用程式中的activity的親和性一樣,所以下面的a情況會在同一個棧中,前面這句話有點拗口,請多讀幾遍),如果有,剛直接把這個棧整體移動到前臺,並保持棧中的狀態不變,即棧中的activity順序不變,如果沒有,則新建一個棧來存放被啟動的activity
a. 前提: Activity A和Activity B在同一個應用中.
操作: Activity A啟動開僻Task堆疊(堆疊狀態: A), 在Activity A中啟動Activity B, 啟動Activity B的Intent的Flag設為
FLAG_ACTIVITY_NEW_TASK, Activity B被壓入Activity A所在堆疊(堆疊狀態: AB).
原因: 預設情況下同一個應用中的所有Activity擁有相同的關係(taskAffinity).
b. 前提: Activity A在名稱為"TaskOne應用"的應用中, Activity C和Activity D在名稱為"TaskTwo應用"的應用中.
操作1: 在Launcher中單擊"TaskOne應用"圖示, Activity A啟動開僻Task堆疊, 命名為TaskA(TaskA堆疊狀態: A),
在Activity A中啟動Activity C, 啟動Activity C的Intent的Flag設為FLAG_ACTIVITY_NEW_TASK,
Android系統會為Activity C開僻一個新的Task, 命名為TaskB(TaskB堆疊狀態: C), 長按Home鍵, 選擇TaskA,
Activity A回到前臺, 再次啟動Activity C(兩種情況1.從桌面啟動;2.從Activity A啟動,兩種情況一樣), 這時TaskB回到前臺, Activity C顯示, 供使用者使用, 即:
包含FLAG_ACTIVITY_NEW_TASK的Intent啟動Activity的Task正在執行, 則不會為該Activity建立新的Task,
而是將原有的Task返回到前臺顯示.
操作2: 在Launcher中單擊"TaskOne應用"圖示, Activity A啟動開僻Task堆疊, 命名為TaskA(TaskA堆疊狀態: A),
在Activity A中啟動Activity C,啟動Activity C的Intent的Flag設為FLAG_ACTIVITY_NEW_TASK,
Android系統會為Activity C開僻一個新的Task, 命名為TaskB(TaskB堆疊狀態: C), 在Activity C中啟動
Activity D(TaskB的狀態: CD) 長按Home鍵, 選擇TaskA, Activity A回到前臺, 再次啟動Activity C(從桌面或者ActivityA啟動,也是一樣的),
這時TaskB回到前臺, Activity D顯示,供使用者使用.說明了在此種情況下設定FLAG_ACTIVITY_NEW_TASK後,會先查詢是不是有Activity C存在的棧,根據親和 性(taskAffinity),如果有,剛直接把這個棧整體移動到前臺,並保持棧中的狀態不變,即棧中的順序不變
(2) FLAG_ACTIVITY_CLEAR_TOP:
前提: Activity A, Activity B, Activity C和Activity D在同一個應用中.
操作: Activity A啟動開僻Task堆疊(堆疊狀態: A), 在Activity A中啟動Activity B(堆疊狀態: AB), 在Activity B中啟動
Activity C(堆疊狀態: ABC), 在Activity C中啟動Activity D(堆疊狀態: ABCD), 在Activity D中啟動Activity B,
啟動Activity B的Intent的Flag設定為FLAG_ACTIVITY_CLEAR_TOP, (堆疊狀態: AB).
(3) FLAG_ACTIVITY_BROUGHT_TO_FRONT:
前提: Activity A在名稱為"TaskOne應用"的應用中, Activity C和Activity D在名稱為"TaskTwo應用"的應用中.
操作: 在Launcher中單擊"TaskOne應用"圖示, Activity A啟動開僻Task堆疊, 命名為TaskA(TaskA堆疊狀態: A),
在Activity A中啟動Activity C,啟動Activity C的Intent的Flag設為FLAG_ACTIVITY_NEW_TASK,
Android系統會為Activity C開僻一個新的Task, 命名為TaskB(TaskB堆疊狀態: C), 在Activity C中啟動
Activity D(TaskB的堆疊狀態: CD), 長按Home鍵, 選擇TaskA, Activity A回到前臺, 在Activity A中再次啟動Activity C,
在啟動Activity C的Intent中設定Flag為FLAG_ACTIVITY_BROUGHT_TO_FRONT, TaskB回到前臺,
Activity C顯示, (TaskB的堆疊狀態: C).
(4) FLAG_ACTIVITY_MULTIPLE_TASK:
與FLAG_ACTIVITY_NEW_TASK結合使用, 首先在Intent中設定FLAG_ACTIVITY_NEW_TASK, 開啟Activity,
則啟動一個新Task, 接著在Intent中設定FLAG_ACTIVITY_MULTIPLE_TASK, 再次開啟同一個Activity,則還會新啟動一個Task.
(5) FLAG_ACTIVITY_SINGLE_TOP:
當前Task堆疊中存在ABCD四個Activity, A是棧頂Activity, D為棧底Activity, 存在開啟A的Intent中設定了
FLAG_ACTIVITY_SINGLE_TOP標誌, 則會使用棧頂A, 而不會從新New A.
(6) FLAG_ACTIVITY_RESET_TASK_IF_NEEDED:
一般與FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET結合使用,如果設定該屬性,這個activity將在一個新的task中啟動或者或者被帶到一個已經存在的task的頂部,這時這個activity將會作為這個task的首個頁面載入。將會導致與這個應用具有相同親和力的task處於一個合適的狀態(移動activity到這個task或者從中移出),或者簡單的重置這個task到它的初始狀態
FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET:在當前的Task堆疊中設定一個還原點,當帶有FLAG_ACTIVITY_RESET_TASK_IF_NEEDED的Intent請求啟動這個堆疊時(典型的例子是使用者從桌面再次啟動這個應用),還原點之上包括這個應用將會被清除。應用場景:在email程式中預覽圖片時,會啟動圖片觀覽的actvity,當使用者離開email處理其他事情,然後下次再次從home進入email時,我們呈現給使用者的應該是上次email的會話,而不是圖片觀覽,這樣才不會給使用者造成困惑。
例: 存在Activity A, Activity B, Activity C, Activity A啟動開僻Task堆疊, 命名為TaskA(TaskA堆疊狀態: A),
在Activity A中啟動Activity B(TaskA堆疊狀態: AB), 接著Activity B啟動Activity C(TaskA堆疊狀態: ABC),
啟動Activity C的Intent中設定FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET標題, 這樣TaskA中有一個還原點,
當有包含FLAG_ACTIVITY_RESET_TASK_IF_NEEDED的Intent請求TaskA堆疊時(比如請求Activity A)
系統就會將還原點以上的Activity清除, TaskA堆疊中只剩下了AB.
4. launchMode介紹:
(1) standard:
如果啟動此Activity的Intent中沒有設定FLAG_ACTIVITY_NEW_TASK標誌, 則這個Activity與啟動他的Activity在同一個Task中,
如果設定了Activity請參考上面FLAG_ACTIVITY_NEW_TASK的詳細說明,"launchMode"設定為"standard"的
Activity可以被例項化多次, 可以在Task中的任何位置, 對於一個新的Intent請求就會例項化一次.
(2) singleTop:
如果啟動此Activity的Intent中沒有設定FLAG_ACTIVITY_NEW_TASK標誌, 則這個Activity與啟動他的Activity在同一個Task中,
如果設定了Activity請參考上面FLAG_ACTIVITY_NEW_TASK的詳細說明,"launchMode"設定為"singleTop"的Activity可以被
例項化多次, 可以在Task中的任何位置, 對於一個新的Intent請求如果在Task棧頂, 則會用棧頂的Activity響影Intent請求,
而不會重新例項化物件接收請求, 如果沒有在棧頂, 則會例項化一個新的物件接收Intent請求.
(3) singleTask:
"launchMode"設定為"singleTask"的Activity總是在棧底, 只能被例項化一次, 它允許其它Activity壓入"singleTask"的Activity
所在的Task棧,如果有新的Intent請求有此標誌的Activity, 則系統會清除有此標誌的Task棧中的全部Activity,並把此Activity顯示出來.
(4) singleInstance:
launchMode"設定為"singleInstance"的Activity總是在棧底, 只能被例項化一次, 不允許其它的Activity壓入"singleInstance"
的Activity所在Task棧, 即整個Task棧中只能有這麼一個Activity.
5. taskAffinity屬性:
(1) taskAffinity屬性應和FLAG_ACTIVITY_NEW_TASK標誌及allowTaskReparenting屬性結合使用, 如果只使用taskAffinity屬性,
請參考上面Task預設的行為.
(2) 與FLAG_ACTIVITY_NEW_TASK標誌結合:
a. 前題: Activity A和Activity B在同一個應用中, Activity A與Activity B設定不同的taskAffinity屬性.
操作: Activity A啟動開僻Task堆疊,命名為TaskA(TaskA堆疊狀態: A), 在Activity A中啟動Activity B, 啟動Activity B
的Intent中設定FLAG_ACTIVITY_NEW_TASK標誌,這時系統會新開僻一個Task堆疊,TaskB(TaskB堆疊狀態: B).
b. 前題: Activity A在"TaskOne應用"中, Activity C在"TaskTwo應用"中, Activity A和ActivityC設定了相同的taskAffinity屬性.
操作: Activity A啟動開僻Task堆疊,命名為TaskA(TaskA堆疊狀態: A), 在Activity A中啟動Activity C, 啟動Activity C的
Intent中設定FLAG_ACTIVITY_NEW_TASK標誌,這時Activity C會壓入與Activity A堆疊相同的TaskA堆疊(TaskA堆疊狀態: AC).
(3) 與allowTaskReparenting屬性:
例: 在"TaskOne應用"中有一個天氣預報Activity A, Activity A與"TaskOne應用"中的其它Activity有預設的關係
(taskAffinity屬性都沒有設定), 並且allowTaskReparenting屬性設定為true, 現在存在一個"TaskTwo應用
"啟動了"TaskOne應用"中的天氣預報Activity A, 這時Activity A與"TaskTwo應用"中的Activity在同一個Task,
命名這個Task堆疊為TaskA, 這時"TaskOne應用"啟動, 並且又開啟發天氣預報Activity A, 這時Activity A會從TaskA堆疊中轉移到
"TaskOne應用"所在的堆疊, 即Activity A可以在多個堆疊中來回轉移.
6. alwaysRetainTaskState屬性:
如果Task堆疊中的Root Activity設定了此屬性值為true, 不管出現任何情況, 一直會保留Task棧中Activity的狀態.
7. clearTaskOnLaunch屬性:
如果Task堆疊中的Root Activity設定了此屬性值為true, 只要你一離開這個Task棧, 則系統會馬上清理除了Root Activity的全部Activity.
8. finishOnTaskLaunch屬性:
如果某Activity設定了finishOnTaskLaunch屬性, 只要你一離開這個Task棧, 則系統會馬上清除這個Activity,
不管這個Activity在堆疊的任何位置.
相關文章
- mysqlbinlog命令詳解 Part 11 其他的一些引數MySql
- Javascript的一些解釋JavaScript
- 垃圾回收的標記清除演算法詳解演算法
- ubuntu16.04安裝CUDA 8.0(很詳盡,包括一些坑的解決方法)Ubuntu
- HashMap原理詳解,包括底層原理HashMap
- 詳解Javascript 中的this指標JavaScript指標
- Android筆記-2-TextView的屬性詳解Android筆記TextView
- tar命令的詳細解釋
- 詳解Android RxJava的使用AndroidRxJava
- [Android]再簡單解釋一下androidtest包下的其他測試類Android
- 指標詳解指標
- CPU、記憶體、快取的關係詳細解釋!記憶體快取
- oracle一些效能檢視的解釋Oracle
- Android 記憶體洩露詳解Android記憶體洩露
- android,記憶體優化詳解Android記憶體優化
- 詳解BetterZip對壓縮包註釋的一些相關小功能
- 一些sql語句的詳細解釋[更新:2006.5.23]SQL
- AWR_RAC的一些指標解讀指標
- Android 的各種 Drawable 詳解Android
- Android中的onWindowFocusChanged()方法詳解Android
- 給 Android 開發者的 RxJava 詳解AndroidRxJava
- Android shape的使用詳解Android
- 詳解Android中AsyncTask的使用Android
- Android 4.4 的 init 程式詳解Android
- Android中的ANR用法詳解Android
- 詳解 Android 的 Activity 元件【Z】Android元件
- Android中的Context詳解AndroidContext
- Android 中的 Checkbox 詳解Android
- Android 中的 HandlerThread 詳解Androidthread
- Struts2的OGNL標籤詳解
- input 標籤詳解
- img標籤詳解
- ANT標籤詳解
- HTML標籤詳解HTML
- resin配置檔案的詳細解釋
- Android客戶端請求伺服器端的詳細解釋Android客戶端伺服器
- android NDK的android.mk檔案的詳解Android
- [Android]ActivityUnitTestCase解釋Android