Android 四种启动模式 理论与实践与相关知识

39 篇文章 0 订阅
33 篇文章 1 订阅


Activity栈

Android 四种启动模式的学习
在这里插入图片描述

Activity按照其启动时间的先后顺序依次入栈,当回退时,从活动栈的栈顶拿出当前显示的活动,而后对其进行销毁。

一、四种启动模式

1.标准模式(Standard)

标准模式就是最常见的模式,从Activity1->Activity2,如果依次启动Activity1、Activity2、Activity3;那么活动栈中存放的Activity从下往上依次为1 2 3。如果在启动Activity1之后,连续启动两次Activity2,再启动Activity 3,则活动栈中存放的Activity从下往上依次为1 2 2 3。
在这里插入图片描述
需要注意的是,一个应用往往不止有一个活动栈,当一个Activity被启动时,它往往被加载至启动它的Activity所在的栈(SingleInstance除外)

2.单栈顶模式(SingleTop)

单栈顶模式,也称顶部复用模式,如图,当活动栈的页面如图所示,从下往上依次为a,b,c;当栈顶为c时,如果应用想要尝试多开一个c Activity,应用不会再次创建一个新的c Activity,而是会重新复用c Activity,因而该模式也被称为顶部复用模式。
这个模式,可以放置用户位于一个Activity中,重复点击打开该Activity中的操作,能够有效避免内存的浪费。
在这里插入图片描述
需要注意的是,当栈顶为c时,如果应用想要尝试多开一个b Activity(应用中已经存在一个b activity),那么此时,仍然会创建一个b Activity,也就是说该方法仍然会导致活动栈中存在多个Activity.

3.单任务模式(SingleTask)

SingleTask,说白了就是希望应用内的活动栈中,一个活动始终只有一个或者更少,如图,当应用栈从下往上依次为A、B、C、D,如果应用仍然尝试打开B活动,按照标准模式,此时活动栈则会从下往上依次变为A B C D B,但事实是,如果按照SingleTask的做法,应用会直接杀死覆盖在B活动上的Activity,从而保证B位于栈顶且只有一个,从而实现B的复用。
直观感觉上,SingleTask像是暴力的单栈顶模式的做法。
在这里插入图片描述

4.单例模式(SingleInstance)

单例模式,参考Java的单例模式,从始至终,一个类,全局只能有一个,那么放到Android里面就是说,一个活动,从始至终只能有一个;
如图,当包括了A B C D活动的栈想要启动启动模式为SingleInstane的E时,应用会直接为E开启一个栈,并将活动E直接放置于其中,保证栈中只有E一个活动,这往往被应用在自应用启动,便始终要独立运行、具有独占性的活动,,确保其他活动不会对其造成影响,从而保证应用对其的监听。
在这里插入图片描述
应用:来电显示页面

二、实践

1.静态应用

直接在AndroidManifest.xml文件中针对单个Activity的lauchMode属性进行修改

在这里插入图片描述

2.动态应用

通过在Activity中对Intent的flag属性进行设置,相关的属性Google API写得也相当明白,文字提示中也可以看明白。
在这里插入图片描述

三、Activity的任务管理

任务以及返回栈的管理,可以通过一系列的参数设置来进行,具体如下
taskAffinity
TaskAffinity即任务相关性,标识一个Activity所需要的返回栈的名字。默认情况下是包名。设置了相同taskAffinity属性的Activity会被放进同一个栈中。一个返回栈的相关性(affinity)是由这个栈的根Activity的相关性(affinity)决定的。

taskAffinity属性主要与singleTask或allowTaskReparenting结合使用,在其他情况下,这个属性没有作用。这是为什么呢?

allowTaskReparenting
它的主要作用是Activity的迁移,从一个栈迁移到另一个栈,这个迁移跟Activity的taskAffinity有关。

clearTaskOnLaunch
这个属性用来清除回退栈中除了根Activity的所有Activity,只对根Activity起作用。当设置为true时,每次重新进入app,只会看到根Activity。

finishOnTaskLaunch
这个属性与clearTaskOnLaunch相反,它是将本Activity移除出去,而不影响其他的Activity。

alwaysRetainTaskState
这个属性的作用是保存返回栈的状态,只对根Activity起作用。正常情况下,系统清理一个返回栈,会将根Activity之上的所有Activity都清除掉。设置该属性后,系统会保存当前的状态。

总结

写这篇博客的原因是我在AndroidManifest.xml中对Activity进行设置时,对LauchMode产生了好奇,然后经过了查询学习,最后得到的结果,但是笔者仍然心里存在困惑。
对于启动除了单例模式以外的Activity,安卓会直接通过页面从下而上出现的动画或闪烁覆盖掉现有Activity,但是对于单例模式的Activity,启动时,安卓会将现有应用下放往左划动,而后新的Activity页面从右往左出现,类似于应用间切换的动画,那么是不是可以理解为,Android的Activity切换动画不是对应用进行监听,而是对活动栈进行监听呢,笔者始终没有想明白底层的实现细节,希望有知道的小伙伴可以指点一下。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值