Activity Launch Mode(启动模式)

本文详细解析了Android中Activity的启动模式,包括standard、singleTop、singleTask和singleInstance四种模式,以及如何通过AndroidManifest.xml和Intent.addFlags()方法指定启动模式。此外,还介绍了FLAG_ACTIVITY_NEW_TASK和FLAG_ACTIVITY_SINGLE_TOP等重要标志的作用,以及它们在不同场景下的混合使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Activity Launch Mode(启动模式)

要深入理解Activity的启动方式,首先要了解以下几个概念:

  • task(任务) :Android管理Avtivity的基本单位不是Activity,而是有若干个Activity组成的task,task之间是有序的,但相对位置可以调整(当点击正在运行按钮的时候,看到的已经打开的activity列表就是task列表);
  • back stack(返回栈) :task内部,activty使用back stack这种数据结构进行管理,我们在屏幕上见到的是第0个task的栈顶activity,back stack中的activity严格按照stack的管理方式,先进后出;
  • taskAffinity(任务关联):若干个Activity组成一个task。哪些Activity会组成一个task是会收到多个因素的影响的,包括launchModetaskAffinity等。默认情况下,activity的taskAffinity属性就是activity所属Application的包名,也可以在AndroidManifest文件中自定义activity标签下的taskAffinity值。taskAffinity在一定程度上起着task id的作用,一般情况下每个task都会对应一个taskAffinity,通常由task中的第一个activity指定。

指定Activity的Launch Mode

指定Activity的Launch Mode有两种方式:

  1. 通过指定AndroidManifest.xml文件中activity标签中的android:launchMode=""
  2. 在调用Context.startActivity方法启动activity之前,调用Intent.addFlags()方法为intent设置某些flag

注意:当两种方式同时存在时,后者会覆盖前者

android:launchMode

在AndroidManifest.xml文件中使用android:launchMode=""来指定launch mode,有四种可选方式:

  1. standard:标准启动模式,当没有指定的时候,默认使用
    • 启动activity所在的task将被置为第0个task,放在最前面
    • 被启动activity将被实例化,不管之前已经实例化多少次
    • 被启动activity将和启动activity放在同一个task中
    • 点击返回键被启动activity被从task顶端移除并销毁掉
    • Android5.0之后有变化???
  2. singleTop
    • 被启动activity如果被实例化过而且在启动activity所在task的栈顶,不会创建新的实例,而是调用已存在实例的onNewIntent方法;否则,和standard一致
  3. singleTask
    • 如果存在与被启动acitivitytaskAffinity的task,这个task将会被置为第0个task,放在最前面;否则创建一个新的task(taskAffinity被启动activity相同)放在最前面
    • 如果 在与被启动acitivitytaskAffinity的task中 不存在被启动activity的实例,创建新的被启动activity实例,放入与被启动acitivitytaskAffinity的task中
    • 如果 在与被启动acitivitytaskAffinity的task中 存在被启动activity的实例,那么这个实例上面的所有activity实例都会被移除并销毁,是被启动activity置于task顶部
  4. singleInstance
    • 被启动activity如果没有被实例化过,会新建一个task,并创建新的被启动activity实例放到这个task中(不管之前有没有同taskAffinity的task)
    • 被启动activity如果已经被实例化过,和singleTask一致
    • 被启动activity启动其他activity的时候,新被启动的activity 不会和被启动activity在同一个task中,而是由android:taskAffinity指定(行为与加了FLAG_ACTIVITY_NEW_TASK标志一致)

Intent.addFlags()

Context.startActivity(Intent intent)方法在被调用之前可以通过给intent设置不同的标志(Intent.addFlags(int flag))改变activity的launch mode,主要的标志有以下几种:

  1. FLAG_ACTIVITY_NEW_TASK:官方文档说与singleTask一致,但是经过实测,是不一致的
    • 如果存在 与被启动acitivitytaskAffinity的task,这个task将会被置为第0个task,放在最前面;否则创建一个新的task(taskAffinity被启动activity相同)放在最前面
    • 不管之前有没有被启动activity实例,创建新的被启动activity实例,放入与被启动acitivitytaskAffinity的task中
  2. FLAG_ACTIVITY_SINGLE_TOP:官方文档说与singleTop一致,实测也是一致的
  3. FLAG_ACTIVITY_CLEAR_TOP
    • 被启动activity如果被实例化过,并且在当前的task1中,不会创建新的实例,而是将原实例上方的所有activity出栈销毁,使原实例置于task顶部
    • 这个标志经常与FLAG_ACTIVITY_NEW_TASK一起使用,这样就可以是被启动activity的行为与singleTask完全一致
      以下是Intent中可以设置的关于activity的一些标志,但是在官方文档tasks and back stacks部分没有提到,我会在实测之后补充它们的用途
  4. FLAG_ACTIVITY_BROUGHT_TO_FRONT
  5. FLAG_ACTIVITY_CLEAR_TASK
  6. FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
  7. FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
  8. FLAG_ACTIVITY_FORWARD_RESULT
  9. FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
  10. FLAG_ACTIVITY_MULTIPLE_TASK
  11. FLAG_ACTIVITY_NO_ANIMATION
  12. FLAG_ACTIVITY_NO_HISTORY
  13. FLAG_ACTIVITY_NO_USER_ACTION
  14. FLAG_ACTIVITY_PREVIOUS_IS_TOP
  15. FLAG_ACTIVITY_REORDER_TO_FRONT
  16. FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
  17. FLAG_ACTIVITY_TASK_ON_HOME

混合使用

在官方文档的tasks and back stacks部分,只提到了当前面两种设置activity的launch mode的方式同时存在的时候,在IntentsetFlags的方式会覆盖在AndroidManifest中设置launchMode的方式,这个很好理解,因为AndroidManifest在应用启动的时候就会被载入,launchMode对应的各种标志就会被设置,而在Intent调用addFlags明显要在后面,相当于启动之前修改了某些标志。


参考资料:
http://developer.android.com/guide/components/tasks-and-back-stack.html
http://www.android-doc.com/guide/components/tasks-and-back-stack.html


  1. 所谓当前的task,不一定是指启动activity所在的task,当Intent中使用了FLAG_ACTIVITY_NEW_TASK标志以后,当前的task就是包含有被启动activity实例的那个task
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值