android launchMode理解以及应用场景

这里写图片描述

这是因为任务管理系统的改进Lollipop使它更有意义。Lollipop,你可以切换回画廊,因为它们是不同的任务。你可以发射另一个意图,一个新的任务将被创建,以服务一个与前一个相同的意图。

这里写图片描述

2.3 应用场景举例

这种activity的一个例子是一个组成电子邮件activity或社交网络的状态张贴activity。如果你考虑一个可以单独工作的活动,为一个单独的意图服务。

举例引用:

AlarmClock uses standard. The user can launch multiple instances of this activity and these instances can be part of any task and anywhere in the activity stack. As a fairly simple application it doesn’t really demand tight control of its activity

闹钟的使用 standard。用户可以启动此activity的多个实例,这些实例可以是任何任务的一部分,也可以是活动堆栈中的任何地方的一部分。作为一个相当简单的应用,它并不真的需要它的activity的严格控制


3.singleTop 模式介绍

singleTop模式。它的作用几乎和standard一样。唯一不同的是,如果已经存在在栈顶在对方的任务一个同类型的活动实例,不会有任何新的activity创造,而是被发送到一个存在的activity实例通过onNewIntent() 方法的意图,即会重用该实例调用当前activity的onNewIntent() 方法。

这里写图片描述

在singleTop模式,对于新的Intent,你要负责onCreate() 和 onNewIntent() 来控制使它适用于所有的情况。

3.1 应用场景举例

这个模式的一个示例用例是一个搜索功能。我们想创造一个搜索框,它会带你到一个SearchActivity看到搜索结果。为了更好的用户体验,我们通常总是把一个搜索框,在搜索结果页面以及让用户做另一个搜索无压回。

现在想象一下,如果我们总是推出服务新的搜索结果的新searchactivity,10次搜索将产生10个新activity。这将是非常奇怪的,当你按下回来,因为你必须要10次,通过这些搜索结果activity,以获得回你的根activity。相反,如果在栈顶 searchactivity,我们最好送一个Intent的一个存在的activity实例,让它更新搜索结果。现在只会有一个searchactivity放在栈顶,你可以简单地按下按钮就回一次回到以前的活动。现在有更多的意义。

反正singleTop 作用相同的任务栈。如果你期望一个Intent被发送到一个存在的活动放置在任何其他任务的顶部,我必须让你失望,说它不工作。如果Intent是从另一个应用程序发送到singleTop activity,新的activity将推出在同一方面作为standard launchMode。

注意:5.0之前:放在对方的任务,5.0以及之后(Lollipop):一个新的任务被创建。

举例引用:

BrowserBookmarksPage uses singleTop. While there can be multiple instances of this activity, if there is already one at the top of the task’s activity stack it will be reused and onNewIntent() will be called. This way you only have to hit back once to return to the browser if the bookmarks activity is started multiple times.

浏览书签页面使用singleTop。虽然有可能是这一活动的多个实例,如果已经有一个在任务栈顶的活动将被重用和onnewintent()将被调用。这样,你只需要返回一次返回到浏览器,如果书签activity是开始多次。


4.singleTask 模式介绍

这种模式和 standard singleTop完全不同。采用singleTask launchMode 的activity是允许在系统中只有一个实例(又名Singleton)。如果系统中有一个存在的活动实例,整个任务将实例将被移动到顶部,Intent将通过onnewintent()方法交付。否则,新的activity将被创建并放置在适当的任务中。

4.1 在同一个应用中

如果没有在系统中还存在singleTask活动实例,新一将要建立简单的放在栈顶在同一个任务。

singleTask

但如果有一个存在的singleTask activity实例放在上面,会自动地破坏(以恰当的方式 生命周期触发)其他的activity,让该实例出现在栈顶。同时,一个Intent是通过的onnewintent()方法送到singleTask activity。

singleTask

在用户体验上没有一个很好的感觉,但它是这样设计的…

The system creates a new task and instantiates the activity at the root of the new task.

注意:系统创建一个新任务并实例化活动新任务的根。

但从实验中,它似乎不工作。单一任务活动仍栈顶上的任务的活动堆栈。从中我们可以看到什么dumpsys活动命令显示。

这里写图片描述


如果你想让一个活动就像描述singleTask文档:创建一个新的任务,把活动作为一根活动。你需要指定的taskAffinity属性为singleTask这样的活动。

这里写图片描述

下面是启动SingleTaskActivity 的结果示例

这里写图片描述

这里写图片描述

考虑是否使用taskAffinity的行为,这是你的工作。


4.2 与另一个应用合作

一旦一个 Intent 是从另一个应用程序发送,并且没有在系统中创建的任何活动实例,新的任务将创建一个新创建的活动作为一个根活动。

这里写图片描述

这里写图片描述

除非有一个应用程序,是一个拥有调用singleTask activity存在的任务,创造了新的活动会放在上面。

这里写图片描述

如果有任何任务存在的活动实例,整个任务将被移动到顶部和每个单独的activity在singleTask activity上的将会被销毁按照正常的生命周期。如果按下后退按钮,用户必须在返回到调用方任务之前通过堆栈中的活动进行。即先关闭图中task#1 中的activity,再回到task#2.

这里写图片描述


4.3 应用场景示例

这种模式的一个示例用例是任何一个入口点活动例如电子邮件客户端的收件箱页面或社交网络的时间轴。无论如何,你必须明智地使用这个模式,在这种模式下活动可能会被破坏。

BrowserActivity uses singleTask. There is only one browser activity at a time and it doesn’t become part tasks that send it intents to open web pages. While it might return to whatever most recently launched it when you hit back it is actually fixed at the bottom of its own task activity stack. It will share its task with activities that it launches like bookmarks

browseractivity使用singleTask。只有一个浏览器的活动的时间,它不成为一部分的任务,把它试图打开网页。虽然它可能会返回到任何最近推出的它,当你回击它实际上是固定在其自己的任务活动栈的底部。它将分享它的任务与活动,它推出像书签.


5.singleInstance 模式介绍

这种模式是相当接近singleTask,单个activity实例可以存在于系统中。不同的是任务举行这次活动,只能有一个活动。如果这种活动调用另一个活动,一个新的任务将被自动创建,以放置新的活动。同样,如果singleInstance活动被被调用,新的任务将会被创建放置这个activity。

无论如何,结果是相当奇怪的。从dumpsys提供的信息,它在系统中有两个任务,但只有一个出现在任务管理器中最新的一个决定,移动到顶部。因此,虽然有一个任务,仍然在后台工作,但我们不能切换到前台。根本没有任何意义。

这是singleInstance活动被调用同时一个activity已经存在在task 中。

singleInstance

但是在任务管理器中看不到新的task

singleInstance2

由于这项任务可能只有一个活动,我们无法切换回任务# 1了。这样做的唯一方法是重新启动的应用程序,但看来singleInstance任务将被隐藏在后台。

简单地分配taskAffinity属性到singleInstance活动使任务管理多个任务。

<activity

android:name=“.SingleInstanceActivity”

android:label=“singleInstance launchMode”

android:launchMode=“singleInstance”

android:taskAffinity=“”>

这样将看到被隐藏的task

这里写图片描述

5.1 应用场景示例

AlarmAlert uses singleInstance. Only one alert activity at a time and it is always its own task. Anything it launches (if anything) becomes part of its own new task

alarmalert使用singleInstance。只有一个警报活动在一个时间,它总是自己的任务。它启动的任何东西(如果有的话)成为它自己的新任务的一部分

这种模式很少被使用。一些真正的用例是一个用于启动或应用程序的活动,你是100%肯定只有一个活动。总之,我建议你不要使用这种模式,除非它是真的有必要。


6.Intent Flags

launchMode是规定你自己的Activity启动的行为模式,而Intent.Flag是你期望由你启动的其他的Activity是什么样的行为模式

除了分配启动模式直接在AndroidManifest.xml,我们也能够通过所谓的意图标志更多的行为分配,例如:

Intent intent = new Intent(StandardActivity.this, StandardActivity.class);

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

startActivity(intent);


7.总结以及参考资料

7.1 总结

[1] standard 模式

这是默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

总结

最后小编想说:不论以后选择什么方向发展,目前重要的是把Android方面的技术学好,毕竟其实对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

这里附上我整理的几十套腾讯、字节跳动,京东,小米,头条、阿里、美团等公司19年的Android面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

技术进阶之路很漫长,一起共勉吧~

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img
点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

[外链图片转存中…(img-1E1b8eur-1712820050680)]

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

技术进阶之路很漫长,一起共勉吧~

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-ciPpGi5F-1712820050680)]

  • 24
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值