面试题 之 『 Activity启动模式 』

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


Activity启动模式:

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

冷静下大兄弟

这种知识点,你们都知道,可是面试,尤为是那种中小型公司问一些基础时,冷不丁给你问一句,4种启动模式,虽然都差很少,但有些细微的差异,很容易搞混淆,彻底能够不用细究,直接收藏保存,之后想看的时候过一遍就行。笔者也是,总是记不住(也不必记),须要的时候翻出来看看就行。这也是我记录的缘由。shell

Standard模式:

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

standard模式

这里给你们推荐一个 ADB 命令能够直接查看到Activity的堆栈信息:adb shell dumpsys activitygoogle

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


SingleTop模式:

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

  • 该Activity在栈顶:.net

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

  • 该Activity不在栈顶:xml

    • 由其余Activity去startActivity 该Activity,那么走的仍是standard模式的规则blog

    就像这样:

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堆栈信息

相关文章
相关标签/搜索