Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> singleTask TaskAffinity allowTaskReparenting,allowtaskreparenting

singleTask TaskAffinity allowTaskReparenting,allowtaskreparenting

編輯:關於android開發

singleTask TaskAffinity allowTaskReparenting,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開發藝術探索》

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved