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结合使用才起作用。
TaskAffinity 和 allowTaskReparenting 结合的用法理解起来比较抽象,这里做个简单的说明。
假设有两个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,收工!
相关文章推荐
- QT窗口与视口(window&ViewPort)的关系,言简意赅的表达。
- ubuntu中安装mongo
- 基于队列的线程池
- Visual Studio 2013版本安装
- web.xml中classpath
- Android自定义控件——PullZoomView
- Android项目,library中根据资源id获取资源
- h5标签语义化
- 字符串数组内搜索的方法
- 如何将word在网页中展现为HTML的形式---Openoffice方式
- angular页面
- Array.prototype.slice应用和原理探析
- 学习笔记(一)——MVC扩展
- local storage (H5本地存储)
- Effective Java读书笔记一
- MFC——6.对话框
- STL源码剖析——空间配置器
- Jenkins执行window batch
- Scanner调用常见格式
- 数据库表表面上存在索引和防错机制,然而一个简单的查询就会耗费很长时间。Web应用程序或许在开发环境中运行良好,但在产品环境中表现同样糟糕。如果你是个数据库管理员,你很有可能已经在某个阶段遇到上述情况。