Activity的启动模式(二)|青训营笔记
这是我参与「第四届青训营 」笔记创作活动的第2天
以下是通过课程学习记录的笔记,同时搜索各种资料进行补充
原文再续书接上一回,话说第三种启动模式
(3)SingleTask
栈内复用启动模式
3.1 特点
- 创建前会查看Activity所在的任务栈是否存在,若不存在则重建一个任务栈,创建Activity实例并置于栈顶(可通过TaskAffinity属性指定Activity想要的任务栈)这个过程还存在一个任务栈的匹配,因为这个模式启动时,会在自己需要的任务栈中寻找实例,这个任务栈就是通过taskAffinity属性指定。如果这个任务栈不存在,则会创建这个任务栈。不设置taskAffinity属性的话,默认为应用的包名。
- 若存在任务栈,则查看该Activity是否存在栈中,若不存在,则创建Activity实例并置于栈顶
- 若该Activity存在栈中,再将实例以上的所有Activity出栈,使该Activity位于栈顶(回调onNewIntent())
3.2 示意图
3.3 使用场景
SingleTask这种启动模式最常使用的就是一个APP的首页,因为一般为一个APP的第一个页面,且长时间保留在栈中,所以最适合设置singleTask启动模式来复用。
(4)SingleInstance
单例启动模式
4.1 特点
- 单实例模式,顾名思义,只有一个实例。该模式具备singleTask模式的所有特性外,与它的区别就是,这种模式下的Activity会单独占用一个Task栈,具有全局唯一性,即整个系统中就这么一个实例,由于栈内复用的特性,后续的请求均不会创建新的Activity实例,除非这个特殊的任务栈被销毁了。以singleInstance模式启动的Activity在整个系统中是单例的,如果再启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,复用这个实例。
- 创建一个Activity则新建一个任务栈,并将该Activity实例放入新栈。
- 一旦该模式的Activity实例已存在某个栈中,任何应用激活该Activity都会重用该栈中的实例并进入该应用中,即 多个应用共享该栈中实例
4.2 示意图
4.4 使用场景
singleInstance适合需要与程序分离开的页面。例如闹铃提醒、电话拨号盘界面。