把TASK比作一个班级,affinity则更像是这个班级的班级名称,学校比做系统,Activity更像是班级里的学生
如果没有对activity设置该属性的话,默认为application的taskAffinity,如果application也没有设置,则为app的包名.
启动一个singleTask模式的activity,会首先在系统中找与它的taskAffinity属性一致的任务栈,
-
先找task
-
没有特别指定taskAffinity,则为当前的task
-
如果指定了taskAffinity,先在系统中查找task,如果找不到则创建一个新的task,将activity作为root放置其中.
-
启动Activity
如果第一步中的task中已经有了这个activity的实例,则将其显示(将task中该activity上层的activity都pop出任务栈),同时intent将被通过onNewIntent()发送.
对设置为singleTask的activity的总结
并不是一定会在新的任务栈中打开.(具体要根据taskAffinity(班级名称)看系统(学校)中是否已经有这个任务栈(班级)了).
如果需要在新的任务栈中启动,就需要为activity设置独立的taskAffinity.
如果任务栈中已存在该activity,那么会将上层的所有activity弹出.
如果当前activity是在新的任务栈中打开的话,那么之后在该activity中通过默认方式启动的activity都在这个新的任务栈(这个跟我们接下里要讲的singleInstance有区别)
如果是在新的任务栈中启动的话,最近任务列表(android的多任务键按下后)会有两个,可选择返回至相应的任务栈
- 当作为startActivityForResult启动的目标时
- 4.x版本.会立刻在上个activity中onActivityResult中返回一个为cancel的resultCode.(不管新的activity是否是在新的任务栈中启动)
- 5.x版本.不管是否定义了taskAffinity,都会把将要被启动的activity的启动模式忽略,onActivityResult方法会正常回调
应用场景
该模式的使用场景多类似于邮件客户端的收件箱或者社交应用的时间线Activity(朋友圈)
与 “singleTask” 基本相同,总是该Activity始终是其所在task中唯一仅有的成员;之后在该activity中启动的activity都不会在其所在的task中.
总结
- 当作为startActivityForResult启动的目标时(下文中的它都是指被启动的activity)
- 4.x版本.在新的任务栈中启动,并立刻在启动它的activity中的onActivityResult中返回一个为cancel的resultCode.singleInstance的特点还在
- 5.x版本.并不会在新的任务栈中启动,而是直接在当前任务栈启动(会出现多个实例),启动它的activity的onActivityResult方法会在它关闭后,正常回调.重点是被它开启的activity将运行在另外一个新的任务栈中.
应用场景
- 呼叫来电界面 InCallScreen
常用的Intent Flag
文档摘录: 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