Activity启动模式和Intent标记

前置

  • 查看当前任务栈

    adb shell dumpsys activity activities | sed -En -e ‘/Running activities/,/Run #0/p’

1. 四种启动模式

  • standard

    标准模式

  • singleTop

    栈顶复用, 当启动的Activity位于栈顶的时候, 直接复用, 调用 onNewIntent方法

  • singleTask

    A–>B–>C–>B (B是singleTask)

    1. 第一次启动B之后的任务栈(B是否在新任务中启动)

      B和A在同一个任务栈中

    2. 加入taskAffinity之后启动B的效果

      B在独立的任务栈中

    3. C中再去启动B

      C被销毁, B的onNewIntent被调用, onCreate不会调用

    官方文档中解释为Activity不存在时会创建新的任务并启动该Activity, 但是如果没有设置亲和性标记并不会创建新的任务

  • singleInstance

    singleInstance模式启动的Activity位于一个独立的任务栈中, 该任务栈只有这一个活动

2. Intent标记

所有的结果自己通过代码测试得到, 不确保结果一定正确

  • FLAG_ACTIVITY_NEW_TASK

    A–>B–>C–>B (启动B的时候设置 FLAG_ACTIVITY_NEW_TASK flag)

    1. 没有设置taskAffinity

      B和A同一个栈中, 第二次启动的B没有复用, 栈中依次为 [A, B, C, B]

    2. 给B设置taskAffinity

      B在新的任务栈中启动, 第二次启动B的时候, B上面的C没有清除, B的onNewIntent也没被调用

    3. 第二次启动B的时候加入FLAG_ACTIVITY_CLEAR_TOP标记

      第二次启动B的时候会将C和B都清除, 然后重新启动B, 调用其onCreate方法

    4. 第二次启动B的时候加入FLAG_ACTIVITY_CLEAR_TOP标记, 并设置launchModesingleTop

      B调用了onNewIntent而没有调用onCreate重新创建

    总结: FLAG_ACTIVITY_NEW_TASK 当设置了taskAffinity属性后, 会在新的任务栈中启动Activity,

    当这样的Activity已经存在的时候, 会将对应的任务栈带到前台。和FLAG_ACTIVITY_CLEAR_TOP标记结合时会清除其上面的Activity(包括其自身), 并重现创建该Activity。

  • FLAG_ACTIVITY_SINGLE_TOP

    效果同singleTop启动模式

  • FLAG_ACTIVITY_CLEAR_TOP

    A–>B–>C–>B (第二次启动B的时候设置FLAG_ACTIVITY_CLEAR_TOP)

    1. 第二次启动B的时候调用了B的onCreate, 没有调用onNewIntent方法

    2. 给B设置singleTop启动模式

      第二次启动时, B没有重新创建, 调用了onNewIntent方法

    FLAG_ACTIVITY_CLEAR_TOP calls onCreate() instead of onResume()

    总结: clear_top可以清除已经在任务栈中的Activity之上的所有活动(包括自身), 如果想对当前Activity进行复用, 需要设置启动模式为singleTop才能进行复用

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享