launchMode和Flag
来源:互联网 发布:软件测试计划实例 编辑:程序博客网 时间:2024/06/04 22:12
1. 什么是launchMode?
一个应用通常包含多个Activity,每个Activity根据用户的特定操作而设计,并且可以通过intent来启动其它Activity,甚至可以启动其它应用中的Activity,以便于复用该组件的功能,并且Android会将该Activity保留同一个任务中,以维护无缝的用户体验。
任务是指执行特定操作时与用户交互的一系列Activity集合,任务使用栈来管理一系列的Activity,它是一种“先进后出的”数据结构,该栈又称为“返回栈”或者是“活动栈”。
在默认情况下,多次启动同一个Activity,系统会创建多个实例并把它们一一放入任务栈中,当我们单击back键,会发现这些Activity会一一回退。但是这种默认方式很不高效,且不灵活,而launchMode在多个Activity跳转的过程中扮演着重要的角色,它可以决定是否生成新的Activity实例,是否重用已存在的Activity实例,是否和其他Activity实例公用一个task里。
Activity一共有以下四种launchMode:
1. standard 标准模式
2. singleTop 栈顶复用模式
3. singleTask 栈内复用模式
4. singleInstance 单实例模式
我们可以在AndroidManifest.xml配置的Android:launchMode属性为以上四种之一即可。另一种情况是通过在Intent中设置标志位(Flag)来为Activity指定启动模式,这两种都可以为Activity指定启动模式,但是二者还是有区别的,首先,优先级上,第二种方式的优先级要高于第一种,当两者同时存在时,以第二种方式为准;其次,上述两种方式在限定范围上有所不同,比如,第一种方式无法直接为Activity设定FLAG_ACTIVITY_CLEAR_TOP,而第二种方式无法为Activity指定singleInstance模式。
2. 模式和标志详细介绍。
- standard: 标准模式,系统的默认模式。每次启动一个Activity都会重新创建一个新的实例,不管这个实例是否已经存在。在这种模式下,
谁启动这个Activity,那么这个Activity就运行在启动它的那个Activity所在的栈中。不管这个Activity是否设置了自身的TaskAffinity值。
如果是在一个Service或者一个广播中启动一个标准模式的Activity的时候会报错,这是因为standard模式的Activity默认会进入启动它的Activity所属的任务栈,但是非Activity类型组件并没有所谓的任务栈,所以就有这个问题。解决这个问题的方法是为通过Intent为待启动Activity指定FLAG_ACTIVITY_NEW_TASK,它实际是singleTask模式,它可以在没有任务栈的情况,主动创建一个任务栈和实例。 - singleTop:栈顶复用模式。在这种模式下,如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时他的onNewIntent方法会被回调。如果Activity的实例已存在但是不在栈顶,那么新Activity仍然会重新重建。
- singleTask:栈内服用模式。在这模式下,只要Activity在一个栈中存在,那么多次启动此Activity都不会重新创建实例,和singleTop一样,系统会回调onNewIntent。
- singleInstace: 单实例模式。
参考:
1. Task and Back stack
2. Android开发艺术探索 :1.2 Activity的启动模式,最深入和全面的讲解。
3. 优秀博客
- launchMode和Flag
- android中的launchMode和flag
- Activity launchmode和Intent flag详解
- android launchMode加载模式和intent flag
- LaunchMode and Flag
- 有关launchMode和intent.flag的一些文章
- Activity launchMode,taskAffinity,Intent.Flag
- Activity的四种LaunchMode和Intent 的flag的使用
- [Android知识体系]之四大组件:activity(LaunchMode和Flag)
- 关于Activity的LaunchMode与Flag
- Android activity launchMode与Intent.Flag关系
- Activity LaunchMode,TaskAffinity,intent过滤规则及Flag资料整理
- Android Intent Flag、taskAffinity属性、launchMode等相关
- Activity LaunchMode和addFlags
- 关于Activity和Flag
- LaunchMode
- LaunchMode
- launchMode
- Oracle BIEE (Business Intelligence) 11g 11.1.1.6.0 学习(3)创建一个简单的分析
- 8086 SS 和 SP 寄存器
- css margin-top设置html元素之间的距离
- 自定义View之手绘时钟
- NS-3 源码修改--实现tcp数据包特征(大小和间隔)服从特定分布
- launchMode和Flag
- C++封装的日期和时间类
- MySQL之——提升Replication性能的两种架构方式
- LCD12864串行与并行的比较分析
- Thread线程之 多生产者与多消费者模拟生产消费
- Oracle BIEE (Business Intelligence) 11g 11.1.1.6.0 学习(4)创建多维钻取分析
- linux系统负载load average的含义
- Android与JS的交互(上)
- 消息邮箱及其操作_读书笔记_7