1. LaunchMode 简介
launchMode 是 Activity 类的一个属性,该属性包括4个具体值:standard、singleTop、singleTask、singleInstance。我们都知道,android 系统中启动 Activity 是通过 Intent 实例进行的,当系统收到一个 Intent 的实例需要去启动指定的 Activity 的时候,android 系统会根据目标 Activity 设置的该属性值来决定是需要创建新的该 Activity 实例以及如何在 Task 中创建该 Activity 的实例。这就是 launchMode 这个属性的作用。
2. 四种启动模式描述
2.1 模式分类
- 普通类型:用户常用的启动模式类型,大部分 Activity 都是这两种启动模式。包括 standard 和 singleTop 两种启动模式;
- 特殊类型:具有特殊的行为的启动模式,只针对特殊需求的使用。包括 singleTask 和 singleInstance 两种启动模式。
2.2 standard
可以有 Activity 多个实例,系统默认的启动模式,当系统接收到一个 Intent 实例去启动一个 standard 模式的 Activity 时,系统总是会在目标栈的顶部创建一个新的 activity 实例,并把 Intent 的实例传进去。
也就是说它可以无限制的创建。你每一次通过 Intent 去启动这种模式的 Activity 都会重新创建一个。
2.2.1 该模式在 android5.0 前后的区别
android 版本 | 目标 Activity 来源 | 目标 Activity 所处栈 |
---|---|---|
5.0之前 | 相同的应用 | 当前应用栈顶部 |
- | 不同的应用 | 当前任务栈顶部 |
5.0之后 | 相同的应用 | 当前应用栈顶部 |
- | 不同的应用 | 新创建任务栈的根部 |
2.3 singleTop
“在顶部只能有一个”。
该模式下的 Activity 实例数要具体情况而定。当系统接收到一个 Intent 实例去启动一个 singleTop 模式的 Activity 时,如果在目标栈的顶部存在一个该 Activity 的实例的话,那么系统就会重用这个 Activity 的实例而不创建新的实例,并回调该 Activity 的 onNewIntent(Intent intent)
方法把新的 Intent 实例当作方法参数传递进去;如果在目标栈的顶部没有该 Activity 的实例的话系统将会再新建一个 Activity 实例,与 standard 的行为就一样了。
所以需要注意的是,在开发时,如果指定了一个 Activity 的启动模式是 singleTop 的那就应该既要重写 onCreated()
方法用于应对第一次创建的情况,也要重写 onNewIntent()
方法来应对重复创建的情况。
2.4 singleTask
该模式只允许存在 Activity 一个实例,当系统接收到一个 Intent 实例去启动一个 singleTask 模式的 Activity 时,如果不存在该 Activity 的实例的话,系统会先创建一个新的 Task,并在该 Task 底部里面创建一个该 Activity 的实例,随后把 Intent 实例传递进去;如果已经存在一个该 Activity 的实例的话,系统就不会再创建新的实例,那么系统就会重用这个 Activity 的实例而不创建新的实例,并回调该 Activity 的 onNewIntent(Intent intent)
方法把新的 Intent 实例当作方法参数传递进去,同时,该 Activity 实例所在的 Task 将会被调到前台。
2.4.1目标Activity和源Activity是否来自同一应用的区别
源Activity和目标Activity来源 | 是否已经存在目标Activity的实例 | 内容 |
---|---|---|
来自同一应用 | 否 | 直接在当前的任务栈中创建SingleTask模式的Activity并置于栈顶 |
- | 是 | 系统会把任务栈中目标Activity之上的所有Activity销毁,以让目标Activity处在栈顶的位置 |
来自不同应用 | 否 | 直接在目标Activity所在应用的任务栈的栈顶创建 |
- | 是 | 目标Activity所在任务栈会被置于前台(即用户可见),而且也会把目标Activity之上的所有Actvity全部销毁。 |
2.5 singleInstance
该模式的 Activity 实例数唯一,类似于 singleTask,唯一不同的地方在于,singleInstance 的 Activity 不允许自己的 Task 中存在其他的 Activity 实例,也就是说 singleInstance 的 Activity 永远是 Task 中唯一的一个 Activity 实例。
3. 使用场景
standard:绝大多数标准的跳转;
singleTop:需要重复进入当前页面,不用重复初始化;
singleTask:只允许拥有一个实例。
网友评论