您的位置:首页 > 其它

Activity启动模式之singleTask

2016-03-18 14:10 246 查看

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 这个参数,如下为注意事项。

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

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

要结合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,收工!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: