Activity启动模式&Task栈

  • 时间:
  • 浏览:1
  • 来源:彩神幸运飞艇_神彩幸运飞艇官方

singleTop属性和allowTaskReparenting混合使用会老出哪此场景?

1、standard

入栈

在不回会 Home键参与的场景下,A_b和B_b是SingleTask的,首先启动A应用的主界面A_a,假如有一天启动A_a启动B应用的B_b,可能B_b是singleTask的,很多很多很多很多创建了新的Task_b。B_b启动应用A的A_b,可能A_b是singleTask的,很多很多很多很多不回会 在Task_b中创建A_b实例,并且我先查找到A_b对应的Task_a,假如有一天在Task_a中创建A_b实例,并将Task_a推到最顶层。

A_b、B_c都在standard模式,A_a启动了A_b,A_b启动了B_c,B_c又启动了A_b,回会 得出如下结论:被启动的Activity可能是standard模式(即使启动者和被启动者所处不同的APP),不回会 被启动的Activity会保所处启动者所属的Task中(不论与非 设置了TaskAffinity属性),且不论该Task中与非 所处被启动实例,总要创建一一十个 新的实例压入栈中。在按back键时也是一一十个 一一十个 的出栈。

启动A应用的主界面A_a,A_a是singleTask的,假如有一天启动了A_b、A_c,这时按下home键,接着原先应用A,发现A_a上面的Activity都被弹出栈了。

home场景3

在AMS中,ActivityRecord对应一一十个 Activity,TaskRecord对应一一十个 Task,每个TaskRecord中保存了若干ActivityRecord,TaskRecord由taskId标识,通过getTaskId()回会 获取Activity所属的Task。ActivityStack中的TaskRecord列表保存了AMS中所有的Task信息,ActivityStack、Task、Activity三者的对应关系如下:

场景2中A_b是singleTask的,可能A_b都在rootActivity,很多很多很多很多不回会 老出Activity出栈操作。

2、singleTop

启动Activity可能使用其他属性,AMS会尝试查找被启动的Activity的taskAffinity相同的Task,可能有,就直接将Task移动到前台,假如有一天将启动的Activity压入栈;可回会 不能,则创建一一十个 新的栈来保存实例。

上图是本文Task的图示法,Task标记为“Task_task名(TaskAffinity)”,Task的TaskAffinity属性是其根Activity的TaskAffinity值;Task中的Activity标记为"应用名_Activity名(TaskAffinity)”,Activity的TaskAffinity通过AndroidManifest.xml中配置。上面的黑线表示Home,黑线下方是点home键退到后台的Task。

首先启动应用A的主界面A_a,假如有一天启动A_b,A_b是singleTask的,且taskAffinity和A_a一致,按下home键并且再启动B应用的主界面B_b,生成可新的Task_b,这并且B_b启动A_b,可能A_b是singleTask的,很多很多很多很多B_b从Task_a中移除了,Task_a所处顶部了。

Activity Task ActivityStack对应关系

home场景4

当一一十个 singleTask 模式的activity 被启动时,AMS会检查与非 所处与该activity 的taskAffinity 相同的task。

先选泽应用A的主界面A_a,假如有一天启动singleInstance的A_b,这里就创建了新的Task_b来保存A_b,假如有一天A_b启动A_c,可能A_b具有独占Task的价值形式,很多很多很多很多都要先查找A_c的taskAffinity(不设置默认使用包名作为Taskname)对应的task与非 所处,可能不所处就创建新的Task,可能所处就将Task推到前台,这里将Task_a推到了前台,并将A_c压入。

假设所有的Activity启动模式都在standard的,这里不回会 加上TaskAffinity,表明该属性不影响Task的归属。有如下运行流程:

1)、首先启动了应用A的主界面A_a,假如有一天A_a启动了A_b,A_a和A_b都在Task_a中,这时按下home键

应用A启动应用B的B_b Activity,B_b是singleTop启动模式,不回会 再次启动B_b时,可能栈顶元素是B_b,就不再创建B_b实例。不论启动者和被启动者与非 属于同一一十个 应用,被启动的Activity和启动的Activity总要在同一一十个 Task中。

2)、启动应用B的主界面B_c,B_c启动了B_d,B_d又启动了A_b,可能A_b是standard的,很多很多很多很多B_c、B_d和A_b在同一一十个 Task_b中,这时再按下home键

home场景2

启动A应用的主界面A_a,所处Task_a中,假如有一天按下home键,启动应用B的主界面B_a,B_a所处Task_b中,这并且B_a启动B_b,可能B_b是singleTask的,且taskAffinity和A_a的taskAffinity一致,很多很多很多很多Task_a会推到前台,假如有一天将B_b的实例塞入Task_a中。

可能设置A_b的启动模式为singleTop,上面的执行流程依然正确,假如有一天却发现Task_a的栈顶有一一十个 A_b实例。

home场景1

2)可能不所处原先的task,不回会 就重新创建task,假如有一天创建该activity 的实例,并入栈,假如有一天将该task 推到最上面。

不回会 Home键参与

3、singleTask

4、singleInstance

该启动模式的activity被启动时,可能activity不回会 被实例化,就创建一一十个 新的task来保存activity实例;可能可能被实例化过,就调用其onNewIntent函数,该activity所在的Task中不允许所处其余activity。

3)、再次点击桌面的A应用,系统会把Task列表中Task_a推到前台,可能A_b设置了allowTaskReparenting属性,很多很多很多很多Task_b中的A_b实例也被转移到了Task_a中。这并且我allowTaskReparenting属性的作用,该属性在task从后台切换到前台的并且起作用。

5、FLAG_ACTIVITY_NEW_TASK

也并且我说,应用不回会 启动是点击桌面应用图标会启动一一十个 新的Task,可能应用可能启动,退到home后台后,再次点击图标,会将home后台的task原封不动重新推到前台,可能rootActivity是singleTask话语,就会将rootActivity上面的Activity对象出栈,假如有一天再将Task推到前台。

这里A_b设置了allowTaskReparenting=true;

其中ActivityStack所处ASM所属程序,ActivityThread在APP所属程序。回会 看过ActivityStack中保存了TaskRecord列表,TaskRecord中保存了Activityrecord列表。在创建可能回退Activity的并且,并且我对ActivityStack中TaskRecord的ActivityRecord进行出栈和入栈操作。

AndroidManifest.xml中回会 给应用配置taskAffinity属性,不设置默认会使用应用的包名作为taskAffinity,taskAffinity不回会 在FLAG_ACTIVITY_NEW_TASK、singleTask、singleInstance的并且有效。桌面打开应用,可能Launcher使用了FLAG_ACTIVITY_NEW_TASK来启动应用,很多很多很多很多会根据主界面设置的taskAffinity可能默认的taskAffinity来查找或创建新的Task,具有相同taskAffinity的Task推到前台。

1)可能所处原先的task,不回会 检查该activity 与非 可能创建,可能已创建,不回会 销毁在该Activity 以上的activity 并调用onNewIntent。可能activity 尚未实例化,不回会 创建该activity 的实例,并压入该task 栈。最后假如有一天将该task 推到最上面。

allowTaskReparenting