Requirement::
应用内有些 Activity 数据敏感,需要区别对待,这里需要识别首次进入红色 Activity 集合内,在红色 Activity 集合内跳转,和跳出红色 Activity 集合三种情况。【当红色 Activity 集合是应用内的 Activity 集合时,就相当于首次进入应用,应用内界面跳转和退出应用的判定】
算法描述:
定义一个保存 Activity Simple Name 的集合。
Activity onResume 时,将此 Activity Simple Name 加入集合。
- 当集合元素个数等于 1 时,为首次进入该应用打开的第一个 Activity。
- 当集合元素个数等于 2 时,表示打开应用内的其他 Activity。
Activity onStop 时,将此 Activity Simple Name 移出集合。
- 当集合元素个数为 1 时,表示在应用内跳转。
- 当集合元素个数为 0 时,表示打开其他应用。
原理:
由上图可知,Activity A 启动 Activity B 时,执行顺序是 Activity A's onPause () -> Activity B's onResume () -> Activity A's onStop ()。应用内的 Activity 在执行 onResume () & onStop () 时,我们规约将其 Activity Simple Name 加入 & 移出集合,而启动应用外的 Activity 我们没有能力如此操作。
- 首次进入 Activity 集合,应用内的 Activity onResume 被调用;
- 在 Activity 集合间跳转,应用内的 Activity onResume & onStop 被调用;
- 跳出 Activity 集合,应用内的 Activity onStop 被调用;
所以,启动应用内还是应用外的 Activity 在此产生差异,而差异让程序识别成为可能。
当 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)
当 Activity B 是应用外 Activity 时,集合内元素个数变迁如下:
Activity A's onPause() -> Activity B's onResume() -> Activity A's onStop()
1(Activity A) 1(Activity A) 0()