allowTaskReparenting的主要作用是activity的迁移,即从一个task迁移到另一个task,这个迁移跟activity的taskAffinity有关,必须是从一个跟该activity taskAffinity不同的task中迁移到跟它taskAffinity相同的task中,且看了下android源代码,只有在发生rese ttask时才会去使用这个标志,而我们从home上启动的程序都带了FLAG_ACTIVITY_RESET_TASK_IF_NEEDED。所以从home上启动程序会进行task reset.也就会使用到这个allowTaskReparenting。
下面来进行我们的测试:
有两个apk:
apk1中含有三个Activity:MainActivity,ActivityB,ActivityB设置了allowTaskReparenting为false.
apk2中含有一个activity:MainActivityB,MainActivityB点击的时候会启动ActivityB
首先我们启动apk2,进入MainActivityB,点击MainActivityB会进入ActivityB,我们看下 这个时候的堆栈:
ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities) Main stack: TaskRecord{419878b0 #82 A com.example.testactivitylaunchflag2 U 0} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.testactivitylaunchflag2/.MainActivityB bnds=[435,1124][579,1268] } Hist #3: ActivityRecord{413c99d8 u0 com.leaves.ipanel/.ActivityB} Intent { act=com.leaves.ipanel.ActivityB cmp=com.leaves.ipanel/.ActivityB } ProcessRecord{413cba38 15618:com.leaves.ipanel/u0a10061} Hist #2: ActivityRecord{41984600 u0 com.example.testactivitylaunchflag2/.MainActivityB} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.testactivitylaunchflag2/.MainActivityB bnds=[435,1124][579,1268] } ProcessRecord{413bccb8 15600:com.example.testactivitylaunchflag2/u0a10063} TaskRecord{41350f60 #2 A com.android.launcher U 0} Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10600000 cmp=com.android.launcher/com.android.launcher2.Launcher } Hist #1: ActivityRecord{41616790 u0 com.android.launcher/com.android.launcher2.Launcher} Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher } ProcessRecord{41615818 628:com.android.launcher/1000} TaskRecord{413cdd58 #69 A com.android.systemui U 0} Intent { act=com.android.systemui.recent.action.TOGGLE_RECENTS flg=0x10c00000 cmp=com.android.systemui/.recent.RecentsActivity (has extras) } Hist #0: ActivityRecord{41429718 u0 com.android.systemui/.recent.RecentsActivity} Intent { act=com.android.systemui.recent.action.TOGGLE_RECENTS flg=0x10800000 cmp=com.android.systemui/.recent.RecentsActivity bnds=[550,3495][862,3690] (has extras) } ProcessRecord{414125b0 464:com.android.systemui/u0a10012}这个时候按Home键,查看堆栈:
ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities) Main stack: TaskRecord{41350f60 #2 A com.android.launcher U 0} Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10600000 cmp=com.android.launcher/com.android.launcher2.Launcher } Hist #3: ActivityRecord{41616790 u0 com.android.launcher/com.android.launcher2.Launcher} Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher } ProcessRecord{41615818 628:com.android.launcher/1000} TaskRecord{419878b0 #82 A com.example.testactivitylaunchflag2 U 0} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.testactivitylaunchflag2/.MainActivityB bnds=[435,1124][579,1268] } Hist #2: ActivityRecord{413c99d8 u0 com.leaves.ipanel/.ActivityB} Intent { act=com.leaves.ipanel.ActivityB cmp=com.leaves.ipanel/.ActivityB } ProcessRecord{413cba38 15618:com.leaves.ipanel/u0a10061} Hist #1: ActivityRecord{41984600 u0 com.example.testactivitylaunchflag2/.MainActivityB} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.testactivitylaunchflag2/.MainActivityB bnds=[435,1124][579,1268] } ProcessRecord{413bccb8 15600:com.example.testactivitylaunchflag2/u0a10063} TaskRecord{413cdd58 #69 A com.android.systemui U 0} Intent { act=com.android.systemui.recent.action.TOGGLE_RECENTS flg=0x10c00000 cmp=com.android.systemui/.recent.RecentsActivity (has extras) } Hist #0: ActivityRecord{41429718 u0 com.android.systemui/.recent.RecentsActivity} Intent { act=com.android.systemui.recent.action.TOGGLE_RECENTS flg=0x10800000 cmp=com.android.systemui/.recent.RecentsActivity bnds=[550,3495][862,3690] (has extras) } ProcessRecord{414125b0 464:com.android.systemui/u0a10012}可以看到MainActivityB和ActivityB移动到了后台
在从Home启动apk1:
ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities) Main stack: TaskRecord{423314b8 #83 A com.leaves.ipanel U 0} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.leaves.ipanel/.MainActivity bnds=[63,1124][207,1268] } Hist #4: ActivityRecord{4132a3d0 u0 com.leaves.ipanel/.MainActivity} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.leaves.ipanel/.MainActivity bnds=[63,1124][207,1268] } ProcessRecord{413cba38 15618:com.leaves.ipanel/u0a10061} TaskRecord{41350f60 #2 A com.android.launcher U 0} Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10600000 cmp=com.android.launcher/com.android.launcher2.Launcher } Hist #3: ActivityRecord{41616790 u0 com.android.launcher/com.android.launcher2.Launcher} Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher } ProcessRecord{41615818 628:com.android.launcher/1000} TaskRecord{419878b0 #82 A com.example.testactivitylaunchflag2 U 0} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.testactivitylaunchflag2/.MainActivityB bnds=[435,1124][579,1268] } Hist #2: ActivityRecord{413c99d8 u0 com.leaves.ipanel/.ActivityB} Intent { act=com.leaves.ipanel.ActivityB cmp=com.leaves.ipanel/.ActivityB } ProcessRecord{413cba38 15618:com.leaves.ipanel/u0a10061} Hist #1: ActivityRecord{41984600 u0 com.example.testactivitylaunchflag2/.MainActivityB} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.testactivitylaunchflag2/.MainActivityB bnds=[435,1124][579,1268] } ProcessRecord{413bccb8 15600:com.example.testactivitylaunchflag2/u0a10063} TaskRecord{413cdd58 #69 A com.android.systemui U 0} Intent { act=com.android.systemui.recent.action.TOGGLE_RECENTS flg=0x10c00000 cmp=com.android.systemui/.recent.RecentsActivity (has extras) } Hist #0: ActivityRecord{41429718 u0 com.android.systemui/.recent.RecentsActivity} Intent { act=com.android.systemui.recent.action.TOGGLE_RECENTS flg=0x10800000 cmp=com.android.systemui/.recent.RecentsActivity bnds=[550,3495][862,3690] (has extras) } ProcessRecord{414125b0 464:com.android.systemui/u0a10012}这个时候只是简单添加了一个MainActivity.虽然从Home启动apk2的时候带有 FLAG_ACTIVITY_RESET_TASK_IF_NEEDED,但在任务重置的过程中什么事也没有做。
我们把ActivityB的allowTaskReparenting改为true,这个时候前面的步骤一样,当我们从Home启动apk2时,我们惊奇的发现,启动的竟然是ActivityB,可以看到此时的堆栈:
ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities) Main stack: TaskRecord{41802828 #86 A com.leaves.ipanel U 0} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.leaves.ipanel/.MainActivity } Hist #4: ActivityRecord{41840a38 u0 com.leaves.ipanel/.ActivityB} Intent { act=com.leaves.ipanel.ActivityB cmp=com.leaves.ipanel/.ActivityB } ProcessRecord{431e8a80 15785:com.leaves.ipanel/u0a10061} Hist #3: ActivityRecord{41802640 u0 com.leaves.ipanel/.MainActivity} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.leaves.ipanel/.MainActivity } TaskRecord{41350f60 #2 A com.android.launcher U 0} Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10600000 cmp=com.android.launcher/com.android.launcher2.Launcher } Hist #2: ActivityRecord{41616790 u0 com.android.launcher/com.android.launcher2.Launcher} Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher } ProcessRecord{41615818 628:com.android.launcher/1000} TaskRecord{416dd178 #85 A com.example.testactivitylaunchflag2 U 0} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.testactivitylaunchflag2/.MainActivityB bnds=[435,1124][579,1268] } Hist #1: ActivityRecord{42401f10 u0 com.example.testactivitylaunchflag2/.MainActivityB} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.testactivitylaunchflag2/.MainActivityB bnds=[435,1124][579,1268] } ProcessRecord{4140d318 15767:com.example.testactivitylaunchflag2/u0a10063} TaskRecord{413cdd58 #69 A com.android.systemui U 0} Intent { act=com.android.systemui.recent.action.TOGGLE_RECENTS flg=0x10c00000 cmp=com.android.systemui/.recent.RecentsActivity (has extras) } Hist #0: ActivityRecord{41429718 u0 com.android.systemui/.recent.RecentsActivity} Intent { act=com.android.systemui.recent.action.TOGGLE_RECENTS flg=0x10800000 cmp=com.android.systemui/.recent.RecentsActivity bnds=[550,3495][862,3690] (has extras) } ProcessRecord{414125b0 464:com.android.systemui/u0a10012}跟显示的结果是一样的,这是由于重置任务的时候把它迁移到了新启动的task中。后面我们分析android源码中的resetTaskIfNeededLocked函数时就会明白这个是怎么回事了。