资讯专栏INFORMATION COLUMN

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

xeblog / 1460人阅读

摘要:每次启动一个,都会创建一个新的实例放在栈顶。这时会移除此实例上的所有实例,使此实例置于栈顶,并复用此实例,回调方法也就是说这是一种栈内的单例模式。这种模式一般应用于的主页,在退出应用程序的时候不需要退出其他的,因为主页一般置于栈底部。

零零碎碎的东西总是记不长久,仅仅学习别人的文章也只是他人咀嚼后留下的残渣。无意中发现了这个每日一道面试题,想了想如果只是简单地去思考,那么不仅会收效甚微,甚至难一点的题目自己可能都懒得去想,坚持不下来。所以不如把每一次的思考、理解以及别人的见解记录下来。不仅加深自己的理解,更要激励自己坚持下去。

launchMode简介 what(是什么)

是Activity的一种配置属性,表示Activity由哪种方式启动

how(怎么用)

有两种配置方式:

在manifest清单文件中配置默认启动属性。

在java代码中,启动Activity时指定启动方式,通过inent.addFlags()方法,这里面常用的有四种。

Intent.FLAG_ACTIVITY_NEW_TASK

Intent.FLAG_ACTIVITY_SINGLE_TOP

Intent.FLAG_ACTIVITY_CLEAR_TOP

Intent.FLAG_ACTIVITY_CLEAN_TASK

具体的使用以及各种搭配使用说明可以看这个Android 之Activity启动模式(二)之 Intent的Flag属性,写的很详细。

why(为什么需要)

在不同的场景考虑到不同形式的Activity实例的复用,选择不同的加载方式。

四种launchMode启动模式

介绍启动模式前,我们先来了解下Android的Activity管理机制。

Android采用Task来管理多个Activity,当我们启动一个应用时,Android就会为之创建一个Task,然后就是启动这个应用程序的入口Activity,并将实例放入Task。

Android并没有为Task提供任何的API,我们无法真正的访问Task,只有一个getTaskId方法获得所在Task的Id。Task通过栈的方式管理Activity实例,包括先进后出、入栈出栈方式都是一样的。

standard模式

默认的启动模式。每次启动一个Activity,都会创建一个新的Activity实例放在Task栈顶。这个Task栈是启动新的Activity的Activity所在的Task栈。那么这时候就会有特殊的情况,如果是service或者Application启动的Activity,并没有Task栈,这时就需要我们通过addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)指定标记,创建一个新的Task。

app的大多数Activity皆采用这种启动模式。作为开发者,我们考虑到的就是用户在操作每个页面后,即使之间有重复的界面,按回退键也可以按照刚刚操作的顺序回退。

singleTop模式

这种模式存在两种情况:

Task栈顶不是要启动的Activity实例,这时和standard模式没有区别

Task栈顶是要启动的Activity实例,那么就会复用这个实例,并且回调该Activity的onNewIntent方法。由于不会创建Activity实例,所以不会回调其他方法。

一般应用于通知详情页或者聊天界面,即通过点击通知栏消息进入Activity。可以避免有多次通知消息通过点击而产生较多Activity实例。增强Activity的复用性。

singleTask

这种模式有三种情况。

Task栈中不存在要启动的Activity实例,这时和standard模式没有任何区别

Task栈中存在要启动的Activity实例,且此实例在栈顶,这时和singleTop模式没有区别

Task栈中存在要启动的Activity实例,且此实例不在栈顶。这时会移除此实例上的所有Activity实例,使此实例置于Task栈顶,并复用此实例,回调onNewIntent方法

也就是说这是一种栈内的单例模式。这种模式下还可以通过manifest文件中的taskAffinity属性来指定要加载的Task栈。

".activitys.MainActivity"
    android:launchMode="singleTask"
    android:taskAffinity="com.gl.task"/>

关于taskAffinity的值:每个Activity都有taskAffinity属性,这个属性指出了它希望进入的Task。如果一个Activity没有显式的指明该Activity的taskAffinity,那么它的这个属性就等于Application指明的taskAffinity,如果Application也没有指明,那么该taskAffinity的值就等于包名。

这种模式一般应用于app的主页,在退出应用程序的时候不需要退出其他的Activity,因为主页一般置于Task栈底部。或者该页面可能会被其他应用程序唤醒,比如浏览器首页。

singleInstance模式

这种模式算是一种全局的单例模式,即只要有任何一个栈存在此Activity实例,就会复用此实例,回调onNewIntent方法。如果此实例不存在,那么就会创建新的Task栈,并放入Activity实例。

也就是说,这种模式下的Activity实例只有两种形式。

不存在此实例

存在此实例,且只在一个Task栈中并且该Task中只有该实例

这种模式一般应用于闹钟响铃界面、拨打接听电话界面等系统界面,确保此Activity实例只能存在一个。 常应用于独立栈操作的应用,如闹钟的提醒页面,当你在A应用中看视频时,闹钟响了,你点击闹钟提醒通知后进入提醒详情页面,然后点击返回就再次回到A的视频页面,这样就不会过多干扰到用户先前的操作了。

另外启动其他应用程序中的Activity的操作,在5.0之前新启动的Activity实例会放入启动的Intent所在的Task栈内,虽然他们并不属于同一应用程序。这好像并不怎么合理,所以在5.0后会创建一个新的Task栈存放外部应用程序的Activity实例

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

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

相关文章

  • 每日一道面试1)---自定义handler如何有效保证内存泄漏问

    摘要:但是如果你直接创建一个对象,然后重写内部方法,那么一定会提醒你会有内存泄漏的可能。所以当的生命周期结束后,而中还存在未处理的消息,那么上面一连串的引用关系就不允许的对象被回收,就造成了内存泄漏。 零零碎碎的东西总是记不长久,仅仅学习别人的文章也只是他人咀嚼后留下的残渣。无意中发现了这个每日一道面试题,想了想如果只是简单地去思考,那么不仅会收效甚微,甚至难一点的题目自己可能都懒得去想,坚持不下...

    番茄西红柿 评论0 收藏0
  • 每日一道面试)---一般什么情况下会导致内存泄漏问

    摘要:显而易见的,当这个是的时,就不存在内存泄漏的问题。这个我在第一期自定义如何有效保证内存泄漏问题已经说得很明白了。 零零碎碎的东西总是记不长久,仅仅学习别人的文章也只是他人咀嚼后留下的残渣。无意中发现了这个每日一道面试题,想了想如果只是简单地去思考,那么不仅会收效甚微,甚至难一点的题目自己可能都懒得去想,坚持不下来。所以不如把每一次的思考、理解以及别人的见解记录下来。不仅加深自己的理解,更要激...

    番茄西红柿 评论0 收藏0
  • 实用性前端知识 - 收藏集 - 掘金

    摘要:与面向对象编程六大方向助你突破前端生涯平台期前端掘金无论我们从事何种职业,在职业生涯的某个阶段,都或多或少会遇到所谓的平台期。目前为止,已经有个用户通过认证登观点年前端初学者的生存指南前端掘金逝者如斯夫,不舍昼夜。 你可能听说过函数式编程(Functional programming),甚至已经使用了一段时间。 但是,你能说清楚,它到底是什么吗? 网上搜索一下,你会轻松找到好多答案...

    Honwhy 评论0 收藏0

发表评论

0条评论

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