Activity启动模式之singleTask

singleTask (栈内复用 )

  • 最常见的情况

    当一个栈Task1中有singleTask模式的Activity1,若是再次启动Activity1则不会创建新的实例,而是回调onNewIntent。同时假设Task1中存在A、B、C三个activity,再次创建A,则会把B和C都清除出栈Task1,同时回调onNewIntent()方法,那么现在Task1中只有A实例。

  • 多个任务栈情况

    假设任务栈Task1中有A、B、C三个activity,现在要启动D这个activity,同时指定D所在的任务栈为Task2,由于Task2还没有创建,需要先创建Task2这个栈,然后再创建D这个实例,并放入Task2中。这里需要注意一点,如果由D启动一个未指定任务栈的 E ,则 E 所在的任务栈也为Task2,即它与启动它的Activity保存在同一个任务栈中。

默认情况下所有activity所在的任务栈的名称和包名一致。涉及到任务栈的感念就要提到 TaskAffinity 这个参数,如下为注意事项。

  1. 命名 一定不能和程序的包名相同,否则和不定义一样。

  2. 名称一定要有“.”分割,亲测不可以直接用一个单词命名,会报错,比如 android:taskAffinity=“single”。但如果是这样定义android:taskAffinity=“.single”就可以。

  3. 要结合singleTask或allowTaskReparenting结合使用才起作用。

TaskAffinityallowTaskReparenting 结合的用法理解起来比较抽象,这里做个简单的说明。

假设有两个APP程序“奢侈商城 S”和“支付软件 Z”。当S在下单activity(下面称S的下单activity为A)中调用了Z的付款activity(下面称Z的付款activity为B,B 设置了allowTaskReparenting为true),按下home键,直接打开Z,会发现看到的不是首页,而是刚才打开的付款activity页面。为什么会这样?这就是allowTaskReparenting的作用。本身S和Z是两个应用,他们的activity分别处于各自的栈中,当S中的A启动了Z的B,那么Z的B就在S的任务栈了,当重新打开了Z,它会发现自己原本的任务栈创建好了,所以就将B从S的任务栈移到Z自己的任务栈中了。

singleTask的运用场景可以是首页。首页作为栈中最底层的一个activity,每当从不同的页面跳回首页都将清除首页上面所有的activity。其他场景的话可以根据不同的业务需求去定。

当然也欢迎有看到这篇文章的小伙伴们做补充,留下你们碰到过的关于启动模式的一些相关使用场景。

同时我这里推荐一本书《Android开发艺术探索》,适合有一定基础的朋友阅读,自己读过一遍,里面讲得很不错,希望可以和大家一起分享。后续还会陆续分享一些我读过的不错的书籍。我的第一篇纯技术文章,Ok,收工!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值