一、TaskAffinity 任务亲和性
taskAffinity 任务栈亲和性
-
taskAffinity相同的activity理应归属于同一个Task。
-
每个Activity都可以设置taskAffinity,当Activity未设置时,默认会和applicatio的taskAffinity保持一致;当Application也未显式设置taskAffinity时,默认会设置成package包名。
-
taskAffinity标签 仅在和SingleTask和FLAG_ACTIVITY_NEW_TASK 配合使用时才有效果,否则无效。
二、launchmode Activity的启动模式
2.1、standard
默认模式,当Intent发送的时候,每次打开都会创建一个新的Activity实例
2.2、singleTop
栈顶复用:
当前activity已经在栈顶的话,则不会再创建一个新的activity,通过onNewIntent()将intent发送给现有的Activity。
2.3、singleTask
栈内复用
2.3.1、理解
- 启动一个singleTask模式的activity,会首先在系统中找与它的taskAffinity属性一致的任务栈。
1、没有特别指定taskAffinity,则为当前的task
2、如果指定了taskAffinity,先在系统中查找相同taskAffinity的task,如果找不到则创建一个新的task,将activity作为root放置其中。
- 找到task之后,如果任务栈中已存在该activity,那么会将上层的所有activity弹出;否则会新创建一个Activity,放入Task中。
- 如果当前activity是在新的任务栈中打开的话,那么之后在该activity中通过默认方式启动的activity都在这个新的任务栈(这和singleInstance是有区别的)
- 如果是在新的任务栈中启动的话,最近任务列表(android的多任务键按下后)会有两个,可选择返回至相应的任务栈
2.3.2、试验:
MainActivity 和StandActivity是stand模式,SingleTaskActivity是singleTask模式:
(1)SingleTaskActivity未设置taskAffinity
跳转流程:MainActivity->SingleTaskActivity->StandActivity
Activity栈情况:
stack 0:
StandardActivity
SingleTaskActivity
mainActivity
(2)SingleTaskActivity设置了taskAffinity = "com.sogou.xxx"
跳转流程:MainActivity->SingleTaskActivity->StandActivity
Activity栈情况:
stack 1:
StandActivity
SingleTaskActivity
stack 0:
MainActivity
2.4、singleInstance
2.4.1、理解
- 无论设置taskAffinity与否,singleInstance都会新创建一个Task
- 新创建的activity 是新task中唯一仅有的成员
- 之后在该activity中启动的activity都不会在其所在的task中.
2.4.2、试验
MainActivity 和StandActivity是stand模式,SingleInstanceActivity是singleInstance模式:
(1) SingleInstanceActivity未设置taskAffinity
跳转流程:MainActivity->SingleInstanceActivity->StandActivity
Activity栈情况:
task0:
StandActivity
MainActivity
task1:
SingleInstanceActivity
Android 多任务栏中 只有一个task
(2)SingleInstanceActivity设置taskAffinity="com.sogou.xxx"
跳转流程:MainActivity->SingleInstanceActivity->StandActivity
Activity栈情况:
task0:
.StandActivity
.MainActivity
task1:
SingleInstanceActivity
Android 多任务栏中可以看到有两个task
小结:
- singleTask 未设置taskAffinity时,不会创建新的Task;指定了taskAffinity时,才会创建一个新的task
- singleInstance模式启动Activity时,无论设置taskAffinity与否,都会创建新的Task
- sinleTask 创建新Task之后,再启动Activity,会归属在新Task栈;singleInstance创建新Task之后,再创建Activity,不会处于当前Task栈中。
网友评论