前言
我记得第一次讨论Activity的开始模式是在2017年8月。 那时,我憧憬着一年后走出校门的未来。 时间还早,毕业4个月了,工作和生活也很稳定。
一.前言
? 很多人和我一样,相信我第一次进入职场的时候不知道Acticity的启动模式,也不知道为了面试而磨练问题,但我不知道启动模式的作用,也不知道如何正确使用启动模式。
二.活动启动模式介绍
活动有四种启动模式:标准、单任务、单实例,缺省启动模式为标准
? 2.1? 标准模式
当程序启动时,缺省情况下将创建任务堆栈。 Activity被放在任务堆栈中。 例如,如果创建一个新项目并缺省生成ActivityA,则任务堆栈可能如下所示:
?
例如,如果ActivityA具有按钮,单击按钮跳转到ActivityB,而ActivityB具有按钮,单击按钮跳转到ActivityC,则堆栈现在将如下所示:
那么,如果ActivityC有按钮呢? 是的,要再次创建ActivityB实例
在这种情况下,单击“上一步”按钮将首先删除堆栈顶部的ActivityB,返回到ActivityC,然后删除堆栈顶部的ActivityC并返回到ActivityB。
Activity全部结束后,系统会自动回收空堆栈。
2.2简单模式
通过更改Activity启动模式,可以将activity lauch mode属性添加到配置文件中
singleTop模式是堆栈顶部的复用模式。 简单地说,如果堆栈顶部的Activity和启动的Activity相同,则直接复用。 例如,还是用ActivityA跳到ActivityB。 将ActivityB的启动模式设置为singleTop。 因为现在的堆栈顶部是ActivityB
现在,在ActivityB上单击按钮以跳转到ActivityB。 当前堆栈的顶部是ActivityB,因此可以直接重用。 此时,堆栈中仍为ActivityB和ActivityA。 此时,单击“上一步”按钮将返回ActivityA。
2.3单任务模式
singleTask是堆栈内复用模式,在此,堆栈内复用区分启动的Activity的所需堆栈是否为当前堆栈
2.3.1是当前堆栈
例如,如果ActivityA当前的启动模式为singleTask,则在ActivityA中启动ActivityB,并且ActivityB在堆栈中不存在实例,则创建一个ActivityB实例。 此时,堆栈如下所示。
现在,在ActivityB中启动ActivityA时,当前堆栈中是否有ActivityA。 如果将ActivityA移动到堆栈中,并位于ActivityA上方的移动堆栈的顶部,则该堆栈将如下所示:
此时按后退键,当前堆栈将显示为
现在,在ActivityB中启动ActivityA时,位于ActivityA堆栈顶部的ActivityB、ActivityC和ActivityB将移动到堆栈顶部。 堆栈内只是有ActivityA。
2.3.1不是当前堆栈
不是现在的堆栈的情况很特殊,这里简单介绍一下
假设当前任务堆栈为a,a堆栈中有ActivityA、ActivityB,用b启动ActivityC,ActivityC所需的任务堆栈为b。 因为堆栈b不存在,所以首先创建堆栈b,然后创建ActivityC实例并将其放入堆栈b中
TaskAffinity可以理解为任务的亲属性或关联性,默认情况下,APP应用内的所有Activity具有相同的亲和关系
缺省任务堆栈的名称是APP应用程序包名称,也可以在配置文件中设置TaskAffinity属性,但必须与singleTask启动模式成对使用
2.4? 单实例模式
单实例模式也是“在堆栈中”复用模式,例如,当前堆栈中有ActivityA,用a启动ActivityB。 ActivityB的启动模式为singleInstance,此时将创建一个新的任务堆栈,ActivityB实例将创建Activity
2.5 Java代码设置启动模式
除了性能分析外,还可以在Java代码中设置启动模式
intent.setFlags (;
singleTask对应于FLAG_ACTIVITY_NEW_TASK
singleTop对应于FLAG_ACTIVITY_SINGLE_TOP
?
欢迎关注技术公众号,微信号搜索ColorfulCode码男
共享技术文章、共享帖子、技术类型、技术深度,让更多的人通过共享获益。
?