任务和返回栈

  任务(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 可以从其启动的任务移动到与其具有关联的任务(如果该任务出现在前台)。

Hold on, everything is possible.
原文地址:https://www.cnblogs.com/student-note/p/6094107.html