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. 模式和标志详细介绍。
  1. standard: 标准模式,系统的默认模式。每次启动一个Activity都会重新创建一个新的实例,不管这个实例是否已经存在。在这种模式下,谁启动这个Activity,那么这个Activity就运行在启动它的那个Activity所在的栈中。不管这个Activity是否设置了自身的TaskAffinity值。如果是在一个Service或者一个广播中启动一个标准模式的Activity的时候会报错,这是因为standard模式的Activity默认会进入启动它的Activity所属的任务栈,但是非Activity类型组件并没有所谓的任务栈,所以就有这个问题。解决这个问题的方法是为通过Intent为待启动Activity指定FLAG_ACTIVITY_NEW_TASK,它实际是singleTask模式,它可以在没有任务栈的情况,主动创建一个任务栈和实例。
  2. singleTop:栈顶复用模式。在这种模式下,如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时他的onNewIntent方法会被回调。如果Activity的实例已存在但是不在栈顶,那么新Activity仍然会重新重建。
  3. singleTask:栈内服用模式。在这模式下,只要Activity在一个栈中存在,那么多次启动此Activity都不会重新创建实例,和singleTop一样,系统会回调onNewIntent。
  4. singleInstace: 单实例模式。

参考:
1. Task and Back stack
2. Android开发艺术探索 :1.2 Activity的启动模式,最深入和全面的讲解。
3. 优秀博客

0 0
原创粉丝点击