天天看點

singleTask TaskAffinity allowTaskReparenting

關于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