關于singleTask TaskAffinity allowTaskReparenting
一、Activity的LaunchMode
1.standard
2.singleTop:FLAG_ACTIVITY_SINGLE_TOP 棧頂複用模式,即如果棧頂有本activity執行個體,則無需新執行個體化activity。
3.singleTask:FLAG_ACTIVITY_NEW_TASK + FLAG_ACTIVITY_CLEAR_TOP的效果
4.singleInstance:單獨一個棧,且棧内複用,一旦建立後,隻要不銷毀,就不會再建立activity
二、Actvity的Flags
1.FLAG_ACTIVITY_NEW_TASK : 同singleTask
2.FLAG_ACTIVITY_SINGLE_TOP :同singleTop
3.FLAG_ACTIVITY_CLEAR_TOP 與FLAG_ACTIVITY_NEW_TASK配合使用,
4.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS android:excludeFromRecents = "true" 不出現再曆史Activity清單中
三、聚焦singleTask
standard singletop singleinstance都比較容易了解,就是這個singleTask比較難了解,這裡我們對singleTask做下知識整理
singleTask:FLAG_ACTIVITY_NEW_TASK
功能1:棧内複用原則,已有執行個體情況下不建立,隻調用onNewIntent
功能2:預設有clearTop的效果,将已執行個體化的activity上面的activity全部出棧。
1.我們首先要知道一個activity的參數,TaskAffinity
TaskAffinity:辨別Activity所需要的任務棧的名字。預設情況下,Activity所需要的任務棧的名字為應用的包名。可以給每個Activity單獨指定TaskAffinity的屬性。
singleTask要和TaskAffinity配合使用
2.singleTask和TaskAffinity的三個配合原則
(1).目前任務棧S1的棧内情況為ABC,Activity D的TaskAffinity屬性為任務棧S2,ActvityD以singleTask模式請求啟動。
結果:系統先建立任務棧S2,建立D的執行個體入棧S2。最終S1的棧内情況為ABC,S2的棧内情況為D
(2).目前任務棧S1的棧内情況為ABC,Activity D的TaskAffinity屬性為任務棧S1(即不特别指定,預設情況下),ActvityD以singleTask模式請求啟動。
結果:系統直接建立D的執行個體入棧S1,最終S1的棧内情況為ABCD
(3).目前任務棧S1的棧内情況為ADBC,Activity D的TaskAffinity屬性為任務棧S1(即不特别指定,預設情況下),ActvityD以singleTask模式請求啟動。
結果:系統不建立D,切換D到棧頂并調用其onNewIntent方法,并将D上面的Activity全部出棧,最終S1的棧内情況為AD
3.TaskAffinity還有一個功能,就是和allowTaskReparenting結合:
allowTaskReparenting:官方定義是“Whether or not the activity can move from the task that started it to the task it has an affinity for when that task is next brought to the front — "
true
" if it can move, and "
false
" if it must remain with the task where it started.”簡單翻譯就是是否允許該Activity從啟動他的任務(可以了解為activity棧)轉移到與他有親密關系(affinity)的任務中,當有親密關系的任務再次啟動時。
舉例說明:
ActvityA是應用1的主Actvity,ActivityB和ActvityC屬于應用2,B為主Activity。
操作路徑:A啟動C-->點選Home鍵盤到Launcher->點選launcher上的應用2
情況1.ActivityC的allowTaskReparenting屬性為false,此時會進入ActvityB 典型案例:将文字檔案等,分享到短信
原因:目前任務棧1為AC,此時啟動應用2,會啟動任務棧2,然後将主ActivityB放入任務棧2中
情況2:ActivityC的allowTaskReparenting屬性為true,此時會進入ActvityC 典型案例:将文字檔案等,分享到微信
原因:目前任務棧1為AC,此時啟動應用2,會啟動任務棧2,然後系統發現C的taskAffinity屬性任務棧2已經建立,就把C從任務棧1轉移過來,這就是allowTaskReparenting的功能。
四、調試時,我們可以使用adb shell dumpsys activity指令來檢視目前系統的任務棧資訊
參考資料:《Android開發藝術探索》
轉載于:https://www.cnblogs.com/xerrard/p/4981569.html