Activity的任务栈Task以及启动模式与Intent的Flag详解(经典博文,值得收藏

本文详细解析了Android中Activity的Task管理,包括singleTask模式的总结,启动模式与Intent Flag的应用。讨论了如何在不同场景下使用FLAG_ACTIVITY_NEW_TASK、FLAG_ACTIVITY_CLEAR_TASK等标志,以及它们对任务栈的影响。此外,还介绍了Activity的task相关属性,如allowTaskReparenting和clearTaskOnLaunch等,对应用行为的重要影响。
摘要由CSDN通过智能技术生成

把TASK比作一个班级,affinity则更像是这个班级的班级名称,学校比做系统,Activity更像是班级里的学生

如果没有对activity设置该属性的话,默认为application的taskAffinity,如果application也没有设置,则为app的包名.

启动一个singleTask模式的activity,会首先在系统中找与它的taskAffinity属性一致的任务栈,

  1. 先找task
  2. 没有特别指定taskAffinity,则为当前的task

  3. 如果指定了taskAffinity,先在系统中查找task,如果找不到则创建一个新的task,将activity作为root放置其中.

  4. 启动Activity

如果第一步中的task中已经有了这个activity的实例,则将其显示(将task中该activity上层的activity都pop出任务栈),同时intent将被通过onNewIntent()发送.

对设置为singleTask的activity的总结

  1. 并不是一定会在新的任务栈中打开.(具体要根据taskAffinity(班级名称)看系统(学校)中是否已经有这个任务栈(班级)了).
  2. 如果需要在新的任务栈中启动,就需要为activity设置独立的taskAffinity.
  3. 如果任务栈中已存在该activity,那么会将上层的所有activity弹出.
  4. 如果当前activity是在新的任务栈中打开的话,那么之后在该activity中通过默认方式启动的activity都在这个新的任务栈(这个跟我们接下里要讲的singleInstance有区别)
  5. 如果是在新的任务栈中启动的话,最近任务列表(android的多任务键按下后)会有两个,可选择返回至相应的任务栈
  6. 当作为startActivityForResult启动的目标时
  7. 4.x版本.会立刻在上个activity中onActivityResult中返回一个为cancel的resultCode.(不管新的activity是否是在新的任务栈中启动)
  8. 5.x版本.不管是否定义了taskAffinity,都会把将要被启动的activity的启动模式忽略,onActivityResult方法会正常回调
应用场景

该模式的使用场景多类似于邮件客户端的收件箱或者社交应用的时间线Activity(朋友圈)

  1. singleInstance

与 “singleTask” 基本相同,总是该Activity始终是其所在task中唯一仅有的成员;之后在该activity中启动的activity都不会在其所在的task中.

总结

  1. 当作为startActivityForResult启动的目标时(下文中的它都是指被启动的activity)
  2. 4.x版本.在新的任务栈中启动,并立刻在启动它的activity中的onActivityResult中返回一个为cancel的resultCode.singleInstance的特点还在
  3. 5.x版本.并不会在新的任务栈中启动,而是直接在当前任务栈启动(会出现多个实例),启动它的activity的onActivityResult方法会在它关闭后,正常回调.重点是被它开启的activity将运行在另外一个新的任务栈中.
应用场景
  1. 呼叫来电界面 InCallScreen

常用的Intent Flag

  1. FLAG_ACTIVITY_NEW_TASK

文档摘录: When using this flag, if a task is already running for the activity you are now starting, then a new activity will not be started

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值