Android中为什么taskAffinity只能配合SingleTask和FLAG_NEW_TASK一起使用?

这其实涉及到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,此时任务栈已经新建了,你把它的名字改一下不影响回退顺序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值