深入浅出安卓启动模式和返回栈
建议先行阅读
Android 面试黑洞——当我按下 Home 键再切回来,会发生什么?
了解任务和返回栈
文章目录
一、任务和返回栈
1.概览 二、启动模式
1.standard2.singleTop3.singleTask4.singleInstance5.singleInstancePerTask 三.Intent的标志位
1.FLAG_ACTIVITY_NEW_TASK2.FLAG_ACTIVITY_SINGLE_TOP3.FLAG_ACTIVITY_CLEAR_TOP 四.清单中的属性
1.alloTaskReparenting2.taskAffinity3.alaysRetainTaskState4.clearTaskOnLaunch5.finishOnTaskLaunch 五、实际应用 一、任务和返回栈 1.概览
任务(Task)是Activity的合集,按应用分为不同的任务,点击应用列表是以任务为单位显示。
回退栈(Back Stack)是Activity的合集,也是任务的合集,表示了Activity的排序顺序,当用户按下返回时应该以什么顺序显示Activity。
二、启动模式 1.standard采用栈的存储结构,先进后出(FILO)。
提示每一层都是Activity,不同颜色表示不同的应用。
2.singleTop只有当栈顶和新加入的Activity相,才会复用,调用onNeIntent(Intent intent)。
3.singleTask当栈中有相同的Activity时,会把该Activity推到栈顶进行复用,清空其上方,调用onNeIntent()。
如上图,复用Activity2,把它推到栈顶,推出了Activity3。
当调用其他Application的Activity时,如果其他Application的回退栈中存在该Activity,会把整个回退栈压到当前的回退栈之上,动画也是跨应用的动画。
如果此时点击应用列表,他们会回到各自的应用。
4.singleInstance独立一个Task出来专门用来复用,该Task不会显示在任务列表中。
此图表示了从Activity1创建到Acitity4的过程。只用Activity3是singleInstance。
此图描述了上述过程,并且从Activity4按下返回键是直接返回到Activity2,从Activity3按下返回也是Activity2。注意Activity3进场和退场的动画。
上述动作描述了当一个TestApplication调用MyApplication的Activity3时,MyApplication的Task压在了Activity3的独立Task之上,再下面是TestApplicaition的Task。
5.singleInstancePerTask“The activity can only be running as the root activity of the task, the first activity that created the task, and therefore there ill only be one instance of this activity in a task. In constrast to the singleTask launch mode, this activity can be started in multiple instances in different tasks if the FLAG_ACTIVITY_MULTIPLE_TASK or FLAG_ACTIVITY_NEW_document is set.”
并没有找到详细的资料,只在官方文档的某个角落找到了上面这段话。我在Android9的环境下测试了,和standard一样;在Android12的环境下测试了,和singleInstance一样。
三.Intent的标志位注意以下的TestApplication中的动作都是调用MyApplication的Activity3。
1.FLAG_ACTIVITY_NEW_TASK创建一个新的Task,并以当前Activity作为栈底,也就是根Activity。
每一个Activity的LaunchMode都是standard,TestApplication启动Activity3的intent设成了改flag。
我个人认为官网的说法是不尽准确的。如果Activity3是singleTask,我们看到的会是下面这种情况。
2.FLAG_ACTIVITY_SINGLE_TOP与singleTop行为相同。
3.FLAG_ACTIVITY_CLEAR_TOP清空其顶部的Activity,并将目标Activity置顶。
这里我也觉得不尽准确,我个人觉得它和singleTask行为模式一样。
注我将这个质疑发送到了官方,等官方回应后再详细写这里。
四.清单中的属性注意
大多数应用不应更改 Activity 和Task的默认行为。如果确定要使用,请做好逻辑测试和心理建设。
我在Android10和Android12都没有测试出来,这里就借一下凯哥的视频吧。
2.taskAffinityAffinity表示相似、亲和性,taskAffinity即与 Activity 有着相似性的任务。同一个包(同一应用)的Activites默认有相同的相似性,也就是包名称。
可以设置该属性,以不同方式将其分组,甚至可以在同一任务内放置不同应用中定义的 Activity。如要指定 Activity 与任何任务均无相似性,将其设置为空字符串。
一个Task中的所有Activity具有相同的askAffinity,默认情况下Activity会直接进入当前Task,与栈底具有相同的taskAffinity。
下面我们来打印taskAffinity来测试一下。
可以得到俩个Activity都是.yeatom.myapplication。
在singleTask的情况下,会寻找与目标Activity具有相同taskAffinity的Task,如果没有就会新建。
多个Task可以具有同样的taskAffinity,只能显示一个最近查看的在任务列表,这就是为什么singleInstanse不会显示在任务列表的原因。像上图,不同的taskAffinity的Task会分别显示在任务列表。
3.alaysRetainTaskState以下我在Android12中没有测试出来,请自行测试。
如果用户离开任务较长时间,系统会清除任务中除根 Activity 以外的所有 Activity。当用户返回到该任务时,只有根 Activity 会恢复。系统之所以采取这种行为方式是因为,经过一段时间后,用户可能已经放弃了之前执行的操作,现在返回任务是为了开始某项新的操作。
alaysRetainTaskState保证了即使经过很长一段时间后,任务仍会在其堆栈中保留所有 Activity。
4.clearTaskonLaunch只要用户离开任务再返回,堆栈就会被清除到只剩根 Activity。
借用其他博主的一句话。finishOnTaskLaunch属性与clearTaskonLaunch 有些类似,它们的区别是finishOnTaskLaunch是作用在自己身上(把自己移除任务栈,不影响别的Activity),而clearTaskOnLaunch则是作用在别人身上(把别的Activity移除任务栈),如果我们把Activity的android:finishOnTaskLaunch属性值设置为true时,离开这个Activity所依赖的任务栈后,当我们重新返回时,该Activity将会被finish掉,而且其他Activity不会受到影响。
五、实际应用standard和singleTop多用于App内部singleInstance多用于开放给外部作为共享singleTask在内部和外部交互都会用得上
本人还没有工作,以后有工作经验会回来这里进行更新实际应用。大家有建议请发给我。
空调维修
- 海信电视维修站 海信电视维修站点
- 格兰仕空调售后电话 格兰仕空调维修售后服务电
- 家电售后服务 家电售后服务流程
- 华扬太阳能维修 华扬太阳能维修收费标准表
- 三菱电机空调维修 三菱电机空调维修费用高吗
- 美的燃气灶维修 美的燃气灶维修收费标准明细
- 科龙空调售后服务 科龙空调售后服务网点
- 华帝热水器维修 华帝热水器维修常见故障
- 康泉热水器维修 康泉热水器维修故障
- 华凌冰箱维修电话 华凌冰箱维修点电话
- 海尔维修站 海尔维修站点地址在哪里
- 北京海信空调维修 北京海信空调售后服务
- 科龙空调维修 科龙空调维修故障
- 皇明太阳能售后 皇明太阳能售后维修点
- 海信冰箱售后服务 海信冰箱售后服务热线电话
- 海尔热水器服务热线