盒子
盒子
文章目录
  1. standard
  2. singleTop
  3. singleTask
  4. singleInstance
  5. End

你不该忽略的LaunchMode

作为一个好的开发人员,不应该忽视掉Activity的启动方式launchMode。每次新建Activity时,内心都要问问自己这个界面启动场景是什么,它应该适应于哪种启动方式?如果要快速灵活的解决上述问题,我们需要对launchMode的四种启动方式了然于胸。下面我会逐一通过简洁的语言介绍它们的意义,同时使用一句话来总结它们各自的特性,帮助我们迅速了然于胸。

standard

如果不对新建的Activity不做任何修改,它在清单文件中默认的launchMode为standard

1
2
3
4
<activity 
android:name=".MainActivity"
android:launchMode="standard">
</activity>

亦或者直接没有launchMode,但内部默认还是standard。大家都知道我们启动的Activity的保存在stack中,假设当前Activity堆栈为

  • D
  • C
  • B
  • A

此时我为B添加launchMode=”standard”,并且在D中启动B,此时Activity堆栈为

  • B (新的实例B)
  • D
  • C
  • B
  • A

所以standard模式表现为:不关心当前Activity堆栈,它总会新增一个实例加入当前堆栈中

singleTop

1.还是之前的Activity堆栈

  • D
  • C
  • B
  • A

现在我对C添加launchMode=”singleTop”,并在D中启动C,此时的Activity堆栈为

  • C (新的实例C)
  • D
  • C
  • B
  • A

这种情况表现方式与默认的standard模式一致

2.如果我将之前的Activity堆栈稍作修改

  • C
  • B
  • A

再次启动C,此时Activity堆栈为

  • C (之前的实例C,新的intent数据可以通过onNewIntent获取)
  • B
  • A

3.如果之前的Activity堆栈中没有C

  • B
  • A

再次启动C,此时Activity堆栈为

  • C (新的实例C)
  • B
  • A

这种情况表现方式与默认的standard模式一致

所以singleTop模式表现为:只关心当前Activity堆栈的栈顶是否存在它的类型实例,如果有则不新建实例;否则新建实例

singleTask

1.当前Activity堆栈为

  • D
  • C
  • B
  • A

现在我对C添加launchMode=”singleTask”,并在D中启动C,此时Activity堆栈为

  • C (之前的实例C,新的intent数据可以通过onNewIntent获取)
  • B
  • A

D会被从Activity堆栈中移除,然后再复用之前的实例

2.当前Activity堆栈为

  • C
  • B
  • A

再次启动C,此时Activity堆栈为

  • C (之前的实例C,新的intent数据可以通过onNewIntent获取)
  • B
  • A

这种情况表现方式与singlTop模式一致

3.当前Activity堆栈为

  • B
  • A

再次启动C,此时Activity堆栈为

  • C (新的实例C)
  • B
  • A

这种情况表现方式与默认的standard模式一致

所以singleTask表现为:只关心当前Activity堆栈中是否存在它的类型实例,如果有则先将它顶部所有堆栈实例出栈,使其回到栈顶,再复用当前栈顶实例,否则新建实例

singleInstance

1.当前Activity堆栈为

  • D
  • C
  • B
  • A

现在我为E添加launchMode=”singleInstance”,然后在D中启动E,此时Activity堆栈为

第一个Activity堆栈

  • D
  • C
  • B
  • A

第二个Activity堆栈

  • E

你会发现E不存在于之前的堆栈中,而是新开一个Activity堆栈。

2.如果在1的结果基础上,我在E中继续启动F,此时Activity堆栈为

第一个Activity堆栈

  • F
  • D
  • C
  • B
  • A

第二个Activity堆栈

  • E

后续启动的实例还是会加入到之前的Activity堆栈中。

3.当前Activity堆栈为

第一个Activity堆栈

  • D
  • C
  • B
  • A

第二个Activity堆栈

  • E

现在我在D中启动E,此时Activity堆栈为

第一个Activity堆栈

  • D
  • C
  • B
  • A

第二个Activity堆栈

  • E (之前的实例E,新的intent数据可以通过onNewIntent获取)

E已经处于单独的Activity堆栈中,不会再新建实例

所以singleInstance表现为:只关心自己是否处于单独的Activity堆栈中,即堆栈中只能有它一个实例,也不新加其它实例;否则新开Activity堆栈

End

希望通过这种方式,你已经对这四种启动模式有了全新的理解。

最后我想问的是:你是否已经了然于胸了?

支持一下
赞赏是一门艺术