资讯专栏INFORMATION COLUMN

面试题 之 『 Activity启动模式 』

lpjustdoit / 1953人阅读

摘要:就像这样启动发现没有实例,直接开辟新栈并将其放入。启动,发现已经存在新栈中,这时候会被呈现给用户,并且回调方法。通过命令查看模式该模式下的会被放入一个新栈中,且处于栈底。既然这样,我们给被启动的加上属性类似于这样完成之后再来看看堆栈信息

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


Activity启动模式:

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

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

Standard模式:

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

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

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


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

该Activity在栈顶:

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

该Activity不在栈顶:

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

就像这样:

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

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

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

singleInstance模式:

栈顶再次启动自己:A->B->B:

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

SingleInstance模式:

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

A启动B发现B没有实例,直接开辟新栈并将其放入。

B在启动C,发现C是标准启动模式,将B放入标准模式的栈中。

C、D、A、启动B,发现已经存在新栈中,这时候B会被呈现给用户,并且回调onNewIntent方法。

标准栈中,依次回退,直到没有Activity之后,才会回到B所在的栈中。

通过ADB命令查看:

SingleTask模式:

该模式下的Activity会被放入一个新栈中,且处于栈底。

该模式下的Activity再次启动别的Activity会被放入当前栈。

该模式下的Activity启动自己,会走onNewIntent

该栈中的其他Activity启动singleTask模式的Activity,其Acitivity上面的所有Activity会被清理掉。

如果使用过该模式的同学应该都遇到过坑,直接设置Androidmanifest.xml文件中的launchMode之后启动发现并不是在一个新的栈中:

什么情况? 不是在一个新的栈中吗? 其实通过源码研究,在ActivityStack中会对被启动的Activity的taskAffinity进行判断所造成的,对于想深入研究的请移步singleTask之谜。,对于这个问题google官方也有一些说明。该模式不适合大多数应用。

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

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




文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/14006.html

相关文章

  • 每日一道面试(第4期)---launchMode的应用场景

    摘要:每次启动一个,都会创建一个新的实例放在栈顶。这时会移除此实例上的所有实例,使此实例置于栈顶,并复用此实例,回调方法也就是说这是一种栈内的单例模式。这种模式一般应用于的主页,在退出应用程序的时候不需要退出其他的,因为主页一般置于栈底部。 零零碎碎的东西总是记不长久,仅仅学习别人的文章也只是他人咀嚼后留下的残渣。无意中发现了这个每日一道面试题,想了想如果只是简单地去思考,那么不仅会收效甚微,甚至...

    xeblog 评论0 收藏0
  • Android面试 | 2021年中高级大厂面试必知必会

    摘要:前言正在准备面试的小伙伴千万不要错过哦在这个金九银十的求职高峰期,小编给大家分享一些收集整理的大厂面试资料。备战金九银十,各位做好准备了吗如果需要文中大厂面试题,扫描下方二维码免费获取哦 ...

    LiuRhoRamen 评论0 收藏0
  • Android经验分享 - 收藏集 - 掘金

    摘要:一次完整的请求与响应涉及了哪些知识掘金本文以请求和响应的过程来讲解涉及到的相关知识点。线程池详解掘金本篇文章讲述中的线程池问题,同样适用于中的线程池使用。一概述全方位了解,总有你不知道的一面掘金关于,是我们接触时频繁了解的东西。 一次完整的 HTTP 请求与响应涉及了哪些知识? - Android - 掘金本文以HTTP请求和响应的过程来讲解涉及到的相关知识点。 一、 HTTP请求和响...

    JiaXinYi 评论0 收藏0
  • 金三银四,2019大厂Android高级工程师面试整理

    摘要:原文地址游客前言金三银四,很多同学心里大概都准备着年后找工作或者跳槽。最近有很多同学都在交流群里求大厂面试题。 最近整理了一波面试题,包括安卓JAVA方面的,目前大厂还是以安卓源码,算法,以及数据结构为主,有一些中小型公司也会问到混合开发的知识,至于我为什么倾向于混合开发,我的一句话就是走上编程之路,将来你要学不仅仅是这些,丰富自己方能与世接轨,做好全栈的装备。 原文地址:游客kutd...

    沈建明 评论0 收藏0
  • 金三银四,2019大厂Android高级工程师面试整理

    摘要:原文地址游客前言金三银四,很多同学心里大概都准备着年后找工作或者跳槽。最近有很多同学都在交流群里求大厂面试题。 最近整理了一波面试题,包括安卓JAVA方面的,目前大厂还是以安卓源码,算法,以及数据结构为主,有一些中小型公司也会问到混合开发的知识,至于我为什么倾向于混合开发,我的一句话就是走上编程之路,将来你要学不仅仅是这些,丰富自己方能与世接轨,做好全栈的装备。 原文地址:游客kutd...

    tracymac7 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<