引用上文生命周期和launchMode介绍, Activity的生命周期实际上比我们想象的复杂得多.
本文主要通过实例, 来探索下Activity的启动Intent Flag以及taskAffinity对生命周期和Task/Back Stack的影响. 算是对生命周期和launchMode的一个补充, 以便我们在开发过程中灵活组合运用.
照例, 我们先从一些官方解释开始:
1, 相关概念
-
对生命周期和Task/Back Stack有影响的Intent Flag主要有:
- FLAG_ACTIVITY_NEW_TASK
- FLAG_ACTIVITY_CLEAR_TOP
- FLAG_ACTIVITY_SINGLE_TOP
-
FLAG_ACTIVITY_NEW_TASK
- 会产生与 "singleTask" launchMode 值相同的行为.
- 在新任务中启动Activity. 如果已有包含该Activity的任务,则该任务会转到前台并恢复其最后状态,同时该Activity会在onNewIntent()中收到新Intent.
-
FLAG_ACTIVITY_SINGLE_TOP
- 会产生与 "singleTop" launchMode 值相同的行为.
- 如果正在启动的Activity是当前Activity(位于返回栈的顶部), 则现有实例会接收对 onNewIntent()的调用,而不是创建 Activity 的新实例.
-
FLAG_ACTIVITY_CLEAR_TOP
- 如果正在启动的 Activity 已在当前任务中运行,则会销毁当前任务顶部的所有 Activity,并通过 onNewIntent() 将此 Intent 传递给 Activity 已恢复的实例(现在位于顶部),而不是启动该 Activity 的新实例.
- 如果指定 Activity 的启动模式为 "standard",则该 Activity 也会从堆栈中删除,并在其位置启动一个新实例,以便处理传入的 Intent。 这是因为当启动模式为 "standard" 时,将始终为新 Intent 创建新实例.
以上为官方文档解释.
在探索Activity之launchMode一文中我们也提到了实际上文档由于"年久失修"没有跟上, 有些解释是不合理的.
我们可以跟随实例一起看下.
2, 开始探索
借用上次探索生命周期的Demo程序.
Github源码地址
通过AActivity, BActivity, CActivity这三个Activity之间的跳转来进行intent flag的探索.
如果没有特别之处, 默认A, B, C三个Activity的launchMode都是默认的standard模式.
2.1, FLAG_ACTIVITY_NEW_TASK
2.1.1, 执行B -> A, B启动A时加FLAG_ACTIVITY_NEW_TASK
实验目的是看下, 在当前系统没有A实例时, 用FLAG_ACTIVITY_NEW_TASK来启动A会不会将A创建在单独的任务中.
BActivity.java中:
原文:https://www.jianshu.com/p/c97688eb5056