• 任务和返回栈


      任务(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.
  • 相关阅读:
    unistd.h文件
    error C3861: “getpid”: 找不到标识符
    #include <unistd.h> 的作用
    VS2013 配置pthread
    VS2008和VC6.0下使用pthread.h头文件
    文件下载之断点续传(客户端与服务端的实现)
    C++ 判断进程是否存在
    C/C++遍历进程和进程ID的小工具
    linux --> 文件系统十问
    网络通信 --> CRC校验
  • 原文地址:https://www.cnblogs.com/student-note/p/6094107.html
Copyright © 2020-2023  润新知