关于singleTask,图中可以看出因为D的taskAffinity没有设置,顾A->D的时候并没有启动新的Task ,奇怪的是当C->D的时候似乎多了一条Task ,并且再次B->C的时候A的Task和DB所在的Task 进行了合并,
关于singleInstance,也存在这种合并的现象,再次C->D的时候会出现AB和B的Task进行了合并。
在C->D的时候如果不仔细看most recent first 的内容,貌似真的多了一个Task
Running activities (most recent first):
TaskRecord{52921ca8 #2 A=com.sxl.launchmode U=0 sz=2}
Run #2: ActivityRecord{529d139c u0 com.sxl.launchmode/com.sxl.launchmode.test.Activity_D t2}
TaskRecord{529ded14 #3 A=com.test.c U=0 sz=1}
Run #1: ActivityRecord{529de6f0 u0 com.sxl.launchmode/com.sxl.launchmode.test.Activity_C t3}
TaskRecord{52921ca8 #2 A=com.sxl.launchmode U=0 sz=2}
Run #0: ActivityRecord{52984824 u0 com.sxl.launchmode/com.sxl.launchmode.test.Activity_A t2}
但我们查看Task 会发现会发现并没有创建新的,而是在原来的基础上多了一个
Stack#1:
Task id #2
TaskRecord{52921ca8 #2 A=com.sxl.launchmode U=0
sz=2}
Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.sxl.launchmode/com.sxl.launchmode.test.Activity_A }
Hist #1: ActivityRecord{529d139c u0 com.sxl.launchmode/com.sxl.launchmode.test.Activity_D t2}
Intent { cmp=com.sxl.launchmode/com.sxl.launchmode.test.Activity_D }
ProcessRecord{5292dfb0 1315:com.sxl.launchmode/u0a58}
Hist #0: ActivityRecord{52984824 u0 com.sxl.launchmode/com.sxl.launchmode.test.Activity_A t2}
Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.sxl.launchmode/com.sxl.launchmode.test.Activity_A }
ProcessRecord{5292dfb0 1315:com.sxl.launchmode/u0a58}
Task id #3
TaskRecord{529ded14 #3 A=com.test.c U=0
sz=1}
Intent { cmp=com.sxl.launchmode/com.sxl.launchmode.test.Activity_C }
Hist #0: ActivityRecord{529de6f0 u0 com.sxl.launchmode/com.sxl.launchmode.test.Activity_C t3}
Intent { cmp=com.sxl.launchmode/com.sxl.launchmode.test.Activity_C }
ProcessRecord{5292dfb0 1315:com.sxl.launchmode/u0a58}
在Navigate Back的图中也证实了这一点。这也印证了Google的官方文档中的图示http://developer.android.com/guide/components/tasks-and-back-stack.html
基于4.4.3源码关于ActivityStack、TaskRecord、ActivityRecord 的关系图,所谓的Stack,Task都是ArrayList。
是如何管理的在源码中的startActivityUncheckedLocked()@frameworks\base\services\java\com\android\server\am\ActivityStackSupervisor.java 中处理的。