闲暇时光android 集结号

Android 任务栈

2018-03-06  本文已影响1270人  三十二蝉

任务与任务栈

任务是指在执行特定作业时与用户交互的一系列 Activity。 这些 Activity 按照各自的打开顺序排列在堆栈(即返回栈)中。设备主屏幕是大多数任务的起点。当用户触摸应用启动器中的图标(或主屏幕上的快捷方式)时,该应用的任务将出现在前台。 如果应用不存在任务(应用最近未曾使用),则会创建一个新任务,并且该应用的“主”Activity 将作为堆栈中的根 Activity 打开。
当前 Activity 启动另一个 Activity 时,该新 Activity 会被推送到堆栈顶部,成为焦点所在。 前一个 Activity 仍保留在堆栈中,但是处于停止状态。Activity 停止时,系统会保持其用户界面的当前状态。 用户按“返回”按钮时,当前 Activity 会从堆栈顶部弹出(Activity 被销毁),而前一个 Activity 恢复执行(恢复其 UI 的前一状态)。 堆栈中的 Activity 永远不会重新排列,仅推入和弹出堆栈:由当前 Activity 启动时推入堆栈;用户使用“返回”按钮退出时弹出堆栈。 因此,返回栈以“后进先出”对象结构运行。

Activity返回栈
任务是一个有机整体,当用户开始新任务或通过“主页”按钮转到主屏幕时,可以移动到“后台”。 尽管在后台时,该任务中的所有 Activity 全部停止,但是任务的返回栈仍旧不变,也就是说,当另一个任务发生时,该任务仅仅失去焦点而已,如图 2 中所示。然后,任务可以返回到“前台”,用户就能够回到离开时的状态。 例如,假设当前任务(任务 A)的堆栈中有三个 Activity,即当前 Activity 下方还有两个 Activity。 用户先按“主页”按钮,然后从应用启动器启动新应用。 显示主屏幕时,任务 A 进入后台。新应用启动时,系统会使用自己的 Activity 堆栈为该应用启动一个任务(任务 B)。与该应用交互之后,用户再次返回主屏幕并选择最初启动任务 A 的应用。现在,任务 A 出现在前台,其堆栈中的所有三个 Activity 保持不变,而位于堆栈顶部的 Activity 则会恢复执行。 此时,用户还可以通过转到主屏幕并选择启动该任务的应用图标(或者,通过从概览屏幕选择该应用的任务)切换回任务 B。这是 Android 系统中的一个多任务示例。
两个任务:任务 B 在前台接收用户交互,而任务 A 则在后台等待恢复。
由于返回栈中的 Activity 永远不会重新排列,因此如果应用允许用户从多个 Activity 中启动特定 Activity,则会创建该 Activity 的新实例并推入堆栈中(而不是将 Activity 的任一先前实例置于顶部)。 因此,应用中的一个 Activity 可能会多次实例化(即使 Activity 来自不同的任务),如图 3 所示。因此,如果用户使用“返回”按钮向后导航,则会按 Activity 每个实例的打开顺序显示这些实例(每个实例的 UI 状态各不相同)。 但是,如果您不希望 Activity 多次实例化,则可修改此行为。 具体操作方法将在后面的管理任务部分中讨论。
一个 Activity 将多次实例化

Activity和任务的默认行为总结

上述文字摘自 Android开发者官网

改变Activity、返回任务栈默认行为的相关属性

默认行为的场景:当前的task包含4个activity–当前activity下面有3个activity。当用户按下HOME键返回到程序启动器(application launcher)后,选择了一个新的应用程序(事实上是一个新的task),当前的task就被转移到后台,新的task中的根activity将被显示在屏幕上。过了一段时间,用户按返回键回到了程序启动器界面,选择了之前运行的程序(之前的task)。那个task,仍然包含着4个activity。当用户再次按下返回键时,屏幕不会显示之前留下的那个activity(之前的task的根activity),而显示当前activity从task栈中移出后栈顶的那个activity。

可以改变任务栈默认行为的Intent标示

可以改变任务栈默认行为的Activity属性

模式\分类 包容activity2的task 一个activity是否允许有多个实例 activity是否允许有其它activity共存于一个task 对于新的intent,是否总是实例化activity对象
standard 如果不包含FLAG_ACTIVITY_NEW_TASK标记,则activity2放入task1,否则按前面讲述的规则为activity2选择task 可被多次实例化,同一个task的不同的实例可位于不同的task中,每个task也可包含多个实例 允许 是的。当接收到新的intent时,总是会生成新的activity对象。
singleTop 同standard 同standard 允许 已存在的activity对象,如果位于目标task的栈顶,则该activity被重用,如果它不位于栈顶,则会实例化新的activity对象
singleTask 将activity2放到task1栈顶 不能有多个实例。由于该模式下添加后的activity总是位于栈顶,所以actvity在同一个设备(如果app只有一个任务栈)里至多只有一个实例 允许。singleTask模式下,添加后的activity总是位于栈顶位置。目标activity实例已存在时,如果该实例刚好位于task栈中,则接收intent,否则到来的intent将会被丢弃,但该可以响应该intent的那个activity所在的task将会被移到前台(若其他应用启动该Activity;如果不存在,则新建Task;如果已经存在于后台Task中,那么后台Task会被切换到前台)
singleInstance 同singleTask 同singleTask 不允许与其它activity共存于一个task。如果activity1的运行在该模式下,则activity2一定与activity1位于不同的task
上一篇下一篇

猜你喜欢

热点阅读