面试题 之 『 Activity启动模式 』

大尾巴狼

终于撇开恶心的业务代码,有时间来复习下android知识了,笔者也属于那种,间歇性雄心斗志,持续性混吃等死,的人,每天加班干到深夜,都 ™ 没时间学习,复习一些知识了,本篇文章也是一种记录,一种备忘,要是一不小心帮助到了别人,想必也是极好的,笔者知识有限,也在学习,难免纰漏,万望海涵,请指正,行,废话就到这儿吧!


Activity启动模式:

什么? 朕的大秦灭亡啦? 你™ 还在讲这种垃圾知识点?

冷静下大兄弟

这种知识点,大家都知道,但是面试,尤其是那种中小型公司问一些基础时,冷不丁给你问一句,4种启动模式,虽然都差不多,但有些细微的差别,很容易搞混淆,完全可以不用细究,直接收藏保存,以后想看的时候过一遍就行。笔者也是,老是记不住(也没必要记),需要的时候翻出来看看就行。这也是我记录的原因。

Standard模式:

这是最普通,系统默认的启动方式,一般我们开发如果没有特殊需求这种模式是使用的最多的,startActivity的时候Activity依次入栈,按下返回键 后进先出 依次回退。类似于这样:

standard模式

这里给大家推荐一个 ADB 命令可以直接查看到Activity的堆栈信息:adb shell dumpsys activity

这个时候我们可以看见,只有一个Activity栈,栈中的Activity排列,以及顶部的Activity(FourthActivity)
Standard模式堆栈信息


SingleTop模式:

该模式和standard模式只有一点点区别:

  • 该Activity在栈顶:

    • 如果该Activity就在栈顶, 那么再次startActivity的时候,并不会再开一个Activity而是,直接重新走该Activity的onNewInstance方法!

  • 该Activity不在栈顶:

    • 由其他Activity去startActivity 该Activity,那么走的还是standard模式的规则

    就像这样:

SingleTop模式

这里面的A_Activity就是singleTop启动模式,且我们可以从前后两个堆栈信息里面看到Activity的情况:

这里我们有4个Activity 分别为A、B、C、D,其中B为SingleTop模式,

  • 正常情况:A->B->C-D
    singleTop正常情况

singleInstance模式:

  • 栈顶再次启动自己:A->B->B:
    正常情况SingleTop

这个时候,不会在去启动新的B,而是直接走了onNewIntent方法。

SingleInstance模式:

该模式下的Activity会被 放入一个新的栈中,并且 该栈中,仅只有该Activity。
就像这样:

  • A启动B发现B没有实例,直接开辟新栈并将其放入。
  • B在启动C,发现C是标准启动模式,将B放入标准模式的栈中。
  • C、D、A、启动B,发现已经存在新栈中,这时候B会被呈现给用户,并且回调onNewIntent方法。
  • 标准栈中,依次回退,直到没有Activity之后,才会回到B所在的栈中。

singleInstance模式

通过ADB命令查看:

singleInstance的堆栈信息

SingleTask模式:

SingleTask模式

  • 该模式下的Activity会被放入一个新栈中,且处于栈底。
  • 该模式下的Activity再次启动别的Activity会被放入当前栈。
  • 该模式下的Activity启动自己,会走onNewIntent
  • 该栈中的其他Activity启动singleTask模式的Activity,其Acitivity上面的所有Activity会被清理掉。

如果使用过该模式的同学应该都遇到过坑,直接设置Androidmanifest.xml文件中的launchMode之后启动发现并不是在一个新的栈中:
singleTask坑
什么情况? 不是在一个新的栈中吗? 其实通过源码研究,在ActivityStack中会对被启动的Activity的taskAffinity进行判断所造成的,对于想深入研究的请移步singleTask之谜。,对于这个问题google官方也有一些说明。该模式不适合大多数应用。

既然这样, 我们给被启动的Activity加上属性taskAffinity类似于这样:

<activity
    android:name=".B_Activity"
    android:launchMode="singleInstance"
    android:taskAffinity="cn.lxw.activitylaunchersequenceB"
    />

完成之后再来看看堆栈信息:
singleTask堆栈信息




阅读 2.8k

古树
进无止境!

间歇性雄心斗志,持续性混吃等死!

246 声望
3 粉丝
0 条评论

间歇性雄心斗志,持续性混吃等死!

246 声望
3 粉丝
文章目录
宣传栏