Acitivity 的启动模式
任务栈简介
栈 — 后进先出的线性表。一个 Android 应用通常包含多个 Activity ,各 Activity 之间通过 Intent 进行连接,而 Android 系统通过栈结构来保存 APP 的 Activity ,栈底 Activity 是整个任务栈的发起者。当一个 APP 启动时,如果当前环境中不存在该 APP 的任务栈时,系统就会创建一个新的任务栈,此 APP 所启动的 Activity 都将在这个任务栈中被管理,这个栈也被称为 Task。一个 Task 中的 Activity 可以来自不同的 APP ,同一个 APP 的 Activity 也可能不再一个 Task 中。standard
Activity 的默认启动模式,在不进行显示的指定下,所有 Activity 都会自动使用此模式,每次启动都会创建一个新的实例,并位于任务栈栈顶。
singleTop
如果 Activity 指定启动模式为 singleTop 模式,那么在启动时,系统会先判断当前栈顶 Activity 是否是要启动的 Activity,如果是则直接使用,否则创建新的实例。此模式通常使用有接收到消息后显示的界面。此模式启动的 Activity 虽然不会创建新的实例,但是启动该 Activity 时回调用 onNewInten()方法。singleTask
singleTask 模式与 singleTop 模式有些类似,singleTop 是检测栈顶元素是否是需要启动的 Activity ,而 singleTaks 是检测整个 Activity 栈中是否存在当前需要启动的 Activity ,如果存在则将该 Activity 置于栈顶,并同时将该 Activity 之上的 Activity 都销毁;如果没有,则创建新的实例。不过这里都是指在同一个 APP 中启动这个 singleTask 的 Activity,如果是其他程序已 singleTask 模式来启动这个 Activity ,那么将创建一个新的任务栈。需要注意的是,如果启动的模式为 singleTask 的 Activity 已经在后台的一个任务栈中,那么启动后,后台的任务栈将一起被切换至前台,参考线官网的图片可以更好理解这一过程。
当 Activity2 启动 ActivityY(singleTask模式) 时,ActivityY 所在的 Task 被切换至前台,且按返回键时,也会返回 ActivityY 所在 Task 的 Activity 。此模式通常可以用来退出整个应用,首先将主 Activity 设为 singleTask 模式,然后在退出的 Activity 中启动都主 Activity,并重写主 Activity 的 onNewIntent() 方法,方法中添加 finish() 方法即可。
- singleInstance
此模式启动的 Activity 会出现在一个新的 Task 中,而且该 Task 中只存在这一个 Activity 。列如:如果应用 A 的任务栈中创建了 ActivityY 的实例,且启动模式为 singleInstance ,如果应用 B 也要启动 ActivityY ,则不需要创建,两个应用共享 ActivityY 的实例。
Intent Flag 启动模式
Intent.FLAG_ACTIVITY_NW_TASK
使用一个新的 Task 来启动一个 Activity ,但启动的每一个 Activity 都将在一个新的 Task 中,通常该 Flag 使用在从 Service 中启动 Activity 。Intent.FLAG_ACTIVITY_SINGLE_TOP
此模式与指定 android:launchMode=”singleTop” 效果相同。Intent.FLAG_ACTIVITY_CLEAR_TOP
此模式与指定 android:launchMode=”singleTask 效果相同。
总结
关于启动模式暂时写到这里,大家可以动手实践便于加深理解,合理的设置启动模式会让程序运行的更有效率,用户体验更好。