任务(Task):
一个程序的启动就是一个任务的创建,一个任务里面又有很多个Activity,为了管理这些Activity返回栈就出现了
返回堆栈
也就是一个常规的堆栈,遵循"先进后出的原则".
也就是说
push a,push b,push c 三次入栈
pop,pop,pop 三次出栈
得到的结果是c ,b,a
Activity 和任务的默认行为总结如下:
当 Activity A 启动 Activity B 时,Activity A 将会停止,但系统会保留其状态(例如,滚动位置和已输入表单中的文本)
。如果用户在处于 Activity B 时按“返回”按钮,则 Activity A 将恢复其状态,继续执行。
用户通过按“主页”按钮离开任务时,当前 Activity 将停止且其任务会进入后台。 系统将保留任务中每个 Activity 的状态。
如果用户稍后通过选择开始任务的启动器图标来恢复任务,则任务将出现在前台并恢复执行堆栈顶部的 Activity。
如果用户按“返回”按钮,则当前 Activity 会从堆栈弹出并被销毁。 堆栈中的前一个 Activity 恢复执行。销毁 Activity 时,
系统不会保留该 Activity 的状态。
既然Activity可能被销毁,那我们需要被保存的状态咋整呢?
保存 Activity 状态
调用onSaveInstanceState()回调
管理任务
有4种方法来管理任务
->使用清单文件
使用清单文件呢,也就是说在ActivityManiFest中的<Activity>节点中来定义任务的行为
主要使用的是下面几个
taskAffinity
launchMode 启动模式
->standard 默认模式
->singleTop 当前活动唯一
->singleTask 单个任务,也是通过onNewIntent()传送,新活动在原来栈中,需要注意的是堆栈上有另一个任务的全部活动
->singleInstance 同上,就是外部活动通过打开一个新任务来启动
allowTaskReparenting
clearTaskOnLaunch
alwaysRetainTaskState
finishOnTaskLaunch
->使用Intent标志
FLAG_ACTIVITY_NEW_TASK //从字面上理解就是新任务,也就是重新打开一个任务,和上面的singleInstance
FLAG_ACTIVITY_CLEAR_TOP //从字面上理解就是清除顶部,也就是如果当前这个Activity在顶部,则调用原来的,否则就删除要 调用的那个的前面的全部
FLAG_ACTIVITY_SINGLE_TOP //和上面的singleTop对应
->清理返回栈
您可以使用下列几个 Activity 属性修改此行为:
alwaysRetainTaskState 保存任务状态
clearTaskOnLaunch 只保存根状态
finishOnTaskLaunch 此属性类似于 clearTaskOnLaunch,但它对单个 Activity 起作用,而非整个任务。
此外,它还有可能会导致任何 Activity 停止,包括根 Activity。 设置为 "true" 时,
Activity 仍是任务的一部分,但是仅限于当前会话。如果用户离开然后返回任务,则任务将不复存在。
->处理关联
->可以使用 <activity> 元素的 taskAffinity 属性修改任何给定 Activity 的关联。
在两种情况下,关联会起作用:
->FLAG_ACTIVITY_NEW_TASK
如果现有任务与新 Activity 具有相同关联,则会将 Activity 启动到该任务中。 否则,将开始新任务。
->Activity 将其 allowTaskReparenting 属性设置为 "true"。
在这种情况下,Activity 可以从其启动的任务移动到与其具有关联的任务(如果该任务出现在前台)。