Requirement::

应用内有些 Activity 数据敏感,需要区别对待,这里需要识别首次进入红色 Activity 集合内,在红色 Activity 集合内跳转,和跳出红色 Activity 集合三种情况。【当红色 Activity 集合是应用内的 Activity 集合时,就相当于首次进入应用,应用内界面跳转和退出应用的判定】

W1aZWR.png

算法描述:

  1. 定义一个保存 Activity Simple Name 的集合。

  2. Activity onResume 时,将此 Activity Simple Name 加入集合。

    1. 当集合元素个数等于 1 时,为首次进入该应用打开的第一个 Activity。
    2. 当集合元素个数等于 2 时,表示打开应用内的其他 Activity。
  3. Activity onStop 时,将此 Activity Simple Name 移出集合。

    1. 当集合元素个数为 1 时,表示在应用内跳转。
    2. 当集合元素个数为 0 时,表示打开其他应用。

原理:

W1aVY9.png

由上图可知,Activity A 启动 Activity B 时,执行顺序是 Activity A's onPause () -> Activity B's onResume () -> Activity A's onStop ()。应用内的 Activity 在执行 onResume () & onStop () 时,我们规约将其 Activity Simple Name 加入 & 移出集合,而启动应用外的 Activity 我们没有能力如此操作。

  1. 首次进入 Activity 集合,应用内的 Activity onResume 被调用;
  2. 在 Activity 集合间跳转,应用内的 Activity onResume & onStop 被调用;
  3. 跳出 Activity 集合,应用内的 Activity onStop 被调用;

所以,启动应用内还是应用外的 Activity 在此产生差异,而差异让程序识别成为可能。

  1. 当 Activity B 是应用内 Activity 时,集合内元素个数变迁如下:

    Activity A's onPause() -> Activity B's onResume() -> Activity A's onStop()

    1(Activity A) 2(Activity A&B) 1(Activity B)

  2. 当 Activity B 是应用外 Activity 时,集合内元素个数变迁如下:

    Activity A's onPause() -> Activity B's onResume() -> Activity A's onStop()

    1(Activity A) 1(Activity A) 0()