这其实涉及到Activity
排序的问题。大家发现没有,不管什么启动模式,都不会打乱栈内Activity
的顺序。
看例子:有A,B,C三个页面,其中A,B默认taskAffinity
,C的taskAffinity
为tc。
下面的例子基于假设:碰到taskAffinity
查找对应的任务栈,没有就新建,有就复用
为什么Standard配合taskAffinity
无效?
此时,A,B,C的启动模式都是standard,假设Standard配合taskAffinity
有效
- 首先启动A,A存放在默认栈中
- A启动B,B存放在默认栈中
- B启动C,这时发现没有tc任务栈,于是新建tc任务栈,将C放在tc任务栈中
现在有两个任务栈,默认任务栈中的顺序为:A,B。tc任务栈的顺序为:C
然后C启动A,重复上面的过程,最后结果是:默认任务栈中的顺序为:A,B,A,B。tc任务栈的顺序为:C,C。
发现问题没有?此时tc为前台任务栈,回退顺序是:C,C,B,A,B,A。与进入的顺序(A,B,C,A,B,C)不同
为什么SingleTop配合taskAffinity
不行
同样按照上面的逻辑。不同之处在于A,B,C三者启动模式都为为SingleTop
,假设SingleTop配合taskAffinity
有效
按照上面的顺序分析,发现跟上面是一样的结果
为什么SingleInstance不行?
说他不行,其实不太准确,因为SingleInstance本来就是新建一个特殊的任务栈,特殊之处在于这个任务栈只能放C。
为什么SingleTask可以
同样按照上面的逻辑。不同之处在于A,B,C启动模式为SingleTask
- 首先启动A,A存放在默认栈中
- A启动B,B存放在默认栈中
- B启动C,这时发现没有tc任务栈,于是新建tc任务栈,将C放在tc任务栈中
- C启动A,A在默认栈低,因此弹出B,将A至于栈顶
- A启动B,B存在放在默认栈中
- B启动C,将tc栈中的C置于栈顶,发现C就位于栈顶,于是不操作。
此时tc任务栈位于前台,默认任务栈位于后台,回退顺序,C,B,A。没有打乱进入的顺序
因此SingleTask可以配合使用
上面都是三者相同的启动模式,发现只有SingleTask
可以,那启动模式不同,是不是SingleTask
就不行了呢。
假设有n个页面 ,其中只有第m个页面的启动模式是SingleTask
,并且设置了taskAffinity
属性为tm,其他的都不是SingleTask
启动模式。
- 当第x个页面启动m页面时,m页面
taskAffinity
属性生效,放在了tm任务栈中 - m页面启动y面,y页面同样放在tm任务栈中
- 。。。
- 第i个界面又启动了m页面
此时,从y到i页面都在tm任务栈中,m位于tm任务栈低)
- 于是m页面上面的页面全部出栈(y到i)
此时回退顺序为:m,x …。依然保持了进入的顺序
实验同样可以扩展到多个任务栈的多个SingleTask
和多个taskAffinity
属性,回退时依然保持顺序,所以taskAffinity
可以配合SingleTask
使用
为什么FLAG_NEW_TASK可以
FLAG_NEW_TASK。会新建一个任务栈存放Activity
,此时任务栈已经新建了,你把它的名字改一下不影响回退顺序。