前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >你不该忽略的LaunchMode

你不该忽略的LaunchMode

作者头像
Rouse
发布2019-07-17 17:59:00
5250
发布2019-07-17 17:59:00
举报
文章被收录于专栏:Android补给站

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

standard

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

代码语言:javascript
复制
1<activity 
2    android:name=".MainActivity"
3    android:launchMode="standard">
4</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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Android补给站 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • standard
  • singleTop
  • singleTask
  • singleInstance
  • End
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档