Android 中有存在着 4 种启动模式,standard,singleTop,singleTask,singleInstance,本篇文章将来解释下这四种模式在的一些基础知识,以及日常开发中的应用,下面通过几个问题来开始本篇文章:
- 什么是 Task?
- Task 与 Activity 的关系是什么?
- 这 4 种启动模式特点分别是什么?
- 这 4 种启动模式的应用场景有什么?
在讲解 4 种启动模式之前需要先学习一下 Task 方面的知识:
Task 解析
Task 可以理解为处理一系列事务的 Activity 合集,那这样就存在两种情况:
1) 该 Task 所有的 Activity属于同一个APP;
2) 该 Task 的 Activity属于不同的APP;
无论是哪种情况,都属于同一个 Task ,记住是同一个 Task !!!
Task的启动方式
- 新建:含有 3 种启动方式
1)通过通知启动 APP
2)通过 Launcher(图标,自己)启动
3)通过 scheme,第三方应用去启动 APP
2.恢复:含有两种启动方式
1)在 Task 一定存在的情况下,通过 Navigation 启动,参考上图,查看Task图片
2)通过标题栏 back 按键back按键
1)生命周期的对应
图片.png
2)onCreate 和 onStart 之间的区别
- 可见与不可见的区别。onCreate 不可见,onStart 可见。
- 执行次数的区别。onCreate 方法只在 Activity 创建时执行一次,而 onStart 方法在 Activity 的切换以及按Home键返回桌面再切回应用的过程中被多次调用。因此 Bundle 数据的恢复在 onStart 中进行比 onCreate 中执行更合适。
-
onCreate 能做的事 onStart 其实都能做,但是 onstart 能做的事 onCreate 却未必适合做。setContentView 和资源初始化在两者都能做,然而想动画的初始化在 onStart 中做比较好。
3)onStart 方法和 onResume 方法的区别 - 是否在前台。onStart 方法中Activity可见但不在前台,不可交互,而在 onResume 中在前台
- 职责不同,onStart 方法中主要还是进行初始化工作,而 onResume方法,根据官方的建议,可以做开启动画和独占设备的操作。
4)onPause 方法和 onStop 方法的区别 - 是否可见。onPause 时 Activity 可见,onStop 时Activity不可见,但Activity对象还在内存中。
- 在系统内存不足的时候可能不会执行onStop方法,因此程序状态的保存、独占设备和动画的关闭、以及一些数据的保存最好在onPause中进行,但要注意不能太耗时。
5)onStop 方法和 onDestroy 方法的区别? - onStop 阶段 Activity 还没有被销毁,对象还在内存中,此时可以通过切换Activity 再次回到该Activity ,而 onDestroy 阶段 Acivity 被销毁。
在学习的过程中我们经常会遇到听到一个方法:onNewIntent,由于 standard 基本每次都会新建一个实例,因此没有这个方法,这个方法只存在于其他 3 种启动方式中。
下面就开始进入今天的主题 4 种启动方式的介绍:
standard
-
在 standard 的启动模式中,如果在 Task 中存在有实例的话,下次从Launcher(图标)进入的话不会再去新建一个实例,而是走OnRestart()过程。这是因为 Intent 中有一个 public static final int FLAG_ACTIVITY_NEW_TASK = 0x10000000;
FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_NEW_TASK图片.png -
当启动一个带有 Affinity 的 Activity 时,如果不带上newTask的话,新建的Activity则会在原来的Task上(所谓的 Affinity 可以理解一个 Task 的名称,当一个 Activity 不指定 Affinity 时,默认就是它的 PackageName)
指定Affinity时,不带newTask,创建在原来的Task上,不会新建Task指定Affinity时,带上newTask,则新建一个Task,在该Task上新建实例 -
如果指定的 Affinity 是默认的APP Affinity (PackageName)的话,每次都会新建一个实例
该效果类似于上面的不指定new_Task
singleTop
指的是一个 Task 的栈顶只能存在一个实例,这里有一点值得注意的是,由于可以存在多个 Task ,因此就存在多个 Task 的栈顶存在相同一个实例的情况。
而当栈顶存在该实例的时候,下次进入的时候不会再去新建实例,而是会调用onNewIntent方法发送到现有的Activity:
singleTask
singleTask 指的是一个Task中只允许存在一个实例,如果该Task中存在该实例的话,下次进入的话也是会通过onNewIntent方法发送到现有的Activity。同样地,由于可以存在多个 Task ,因此就存在多个 Task 中存在相同一个实例的情况。还有一点与singleTop不同的是,当找到Task中存在该实例时,会将它上面的实例清空掉(CLEAR_TOP)然后将实例提到栈顶。而singleTop则是在栈顶找不到实例时,在栈顶新建一个实例,不管它下面有没有。
singleInstance
通过这种方式启动的Activity 都处于一个单独的 Task 中,且该 Task 中也只有一个该实例,下次启动时,如果已经存在该 Task 不会再去新建实例,而是会调用onNewIntent方法发送到现有的Activity类似于singleTask
最后是这 3 种启动模式的应用场景: