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

应用场景这种启动模式的用例之一就是搜索功能。假设我们创建了一个搜索框,点击搜索的时候将导航到一个显示搜索结果列表的SearchActivity中,为了更好的用户体验,这个搜索框一般也会被放到SearchActivity中,这样用户想要再次搜索就不需要按返回键。想像一下,如果每次显示搜索结果的时候我们都启动一个新的activity,10次搜索10个activity,那样当我们想返回最初的那个activity的时候需要按10次返回。所以我们应该这样,如果栈顶已经有一个SearchActivity,我们将
摘要由CSDN通过智能技术生成
应用场景

这种启动模式的用例之一就是搜索功能。假设我们创建了一个搜索框,点击搜索的时候将导航到一个显示搜索结果列表的SearchActivity中,为了更好的用户体验,这个搜索框一般也会被放到SearchActivity中,这样用户想要再次搜索就不需要按返回键。
想像一下,如果每次显示搜索结果的时候我们都启动一个新的activity,10次搜索10个activity,那样当我们想返回最初的那个activity的时候需要按10次返回。
所以我们应该这样,如果栈顶已经有一个SearchActivity,我们将Intent发送给现有的activity,让它来更新搜索结果。这样就只会有一个在栈顶的SearchActivity,只需点一次back就可以回到之前的activity。
不管怎样,singleTop和它的调用者处在一个任务中。如果你想要让intent发送给另一个任务中处于栈顶的Activity,是不行的。
而当Intent来自于另外一个应用的时候,新的Activity的启动方式和standard模式是一致的。

  1. singleTask

首先要引出taskAffinity这个activity的属性.

把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将运
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值