启动模式对于 Android 开发是很重要的,各种启动模式之间的区别必须要掌握,这里简单的归纳一下。
启动模式
Standard
标准模式,不会新建 Task,会重复建立 Activity。
A B C D -New B-> A B C D B'
SingleTop
单 Task,单栈顶元素模式。
当新建 Activity 的时候,如果该 Activity 在栈顶,那么将不会新建 activity,直接复用原有的 activity。
A B C D -New D-> A B C D
如果不在栈顶,那么会重新建立这个 Activity。
A B C D -New B-> A B C D B
SingleTask
在 Task 中只会有一个 Activity 的实例。
- 如果 Task 中没有该 Activity 的实例,那么在栈顶加入新建的 Activity
A B C D -New E-> A B C D E
- 如果 Task 中有该 Activity 的实例,并且在栈顶,那么和 SingleTop 一样的策略
A B C D -New D-> A B C D
- 如果 Task 中有该 Activity 的实例,但是不在栈顶,那么这个时候新建该 Activity,会将已有的该 Activity 实例之前的 Activity 全部出栈。
A B C D -New B-> A B
SingleInstance
在该模式下,不论从哪个 Task 加载 Activity,只会创建一个 Activity 实例,并且会使用一个全新的 Task 栈来装载。
要创建的 Activity 实例不存在,这个时候会创建一个新的 Task 栈,并将 Activity 实例化后放入该栈。
A B C D -New E-> A B C D (New Task) E
要创建的 Activity 实例存在,这时候系统会将该 Activity 所在的 Task 转到前台。
注意此种模式下加载的 Activity 总是处于栈顶的,使用该模式创建的 Task 只包含该 Activity
Intent Flag
Brought to front
如果该 Activity 的实例已经存在了但是不在栈顶,那么将会把这个 Activity 的实例转移到栈顶,如果没有的话当然就是在该 Task 的栈顶加入该 Activity 的实例了:
注意,这里是 A 通过该 Flag 启动 B,然后 D 通过任意方式启动 B,会实现这种效果。
A-Flag->B C D -New B-> A C D B
Clear top
同 SingleTask 的启动模式。
New task
同 Standard 启动模式。
No animation
启动时不使用过渡动画。
No history
从该 Activity 的实例跳转之后不会保留该实例在 Task 栈中:
注意,这里是 C 通过该 Flag 启动 D,D 以任意方式启动 E 得到的结果。
A B-Flag->C D -New E-> A B C E
Reorder to front
如果 Task 栈中已有 Activity 实例,那么通过该 Flag 启动的话,会直接将其转入栈顶。
注意这里与 Brought to front 的区别,前一个 Flag 是在第一次启动那个任务的时候设置的,这个 Flag 不需要第一次启动的时候设置,在下一次用得到的时候再设置,将已有的 Activity 转到前台。
A B C D -Flag New B-> A C D B
Single top
相当于 SingleTop 模式。
v1.5.2