IntentFlag大全及使用总结

引用上文生命周期和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
 

你可能感兴趣的:(Activity跳转)