说到Activity不的不提的一个概念就是,任务栈
1、Activity的任务栈
2、Activity的生命周期
3、Activity的四种启动模式
| launchMode | 名称 | 简介 | 应用场景 |
|---|---|---|---|
| standard | 标准模式 | 整个操作系统只能创建一个实例,并且单独占一个task | |
| singleTop | 栈顶复用模式 | 在一个Task中,只能创建一个实例 | 同类型的Activity,例如: 登录页面 接收到通知启动页面 耗时操作返回页面 |
| singleTask | 栈内复用模式 | 在对应Task的顶部有该实例时,不会新创建一个实例,而是复用该实例 | 程序入口,例如: WebView页面 扫一扫页面 支付页页面 |
| singleInstance | 单实例模式 | 每个Task可以创建多个实例 | 与程序分离的页面,例如: 盗贼入侵报警页面 |
taskAffinity
activity标签中taskAffinity默认使用的是manifest标签中的package的值。
standard启动模式
- 当从非Activity的context启动Activity时,需要添加 FLAG_ACTIVITY_NEW_TASK;
- 不带有FLAG_ACTIVITY_NEW_TASK启动时,每次都创建新的Activity对象,与启动它的那个Activity在同一个栈中;
- 带有FLAG_ACTIVITY_NEW_TASK启动一个带有affinity(和App默认的值不同)的Activity时,如果这个Activity已经有实例存在该task,则不会重新创建,而是切换该任务栈为前台任务栈;
- 如果从应用内启动的standard activity的affinity就是App默认的affinity,则会每次新建一个实例(包括带有FLAG_ACTIVITY_NEW_TASK)。
singleTop启动模式
- 带有 FLAG_ACTIVITY_NEW_TASK,如果affinity的Task存在,去affinity的Task查找,不存在就在当前的Task中查找,栈顶存在该Activity,则会调用该Task中的该Activity的onNewIntent方法。
- 没有FLAG_ACTIVITY_NEW_TASK时,会从当前栈中查找。
singleTask启动模式
affinity的Task中栈是否存在该实例,不存在创建见新,存在的话调用该Activity的onNewIntent方法,同时销毁在该Activity之上的
4、Intent的Flag
FLAG_ACTIVITY_NEW_TASK只对standard和singleTop起作用
FLAG_ACTIVITY_MULTIPLE_TASK只对standard起作用