Android系统中TaskStack与TaskRecord

149 阅读4分钟

一、TaskRecord

TaskRecord 是 Android 操作系统中的一个核心类,用于表示一个任务(Task)在任务管理器中的状态和信息。任务在 Android 中是一个与应用程序相关的概念,通常表示一组活动(Activity)及其在堆栈中的位置。

二、TaskStack

TaskStack 是一个核心的概念,用于管理和组织 任务Task),TaskStack对Task进行管理。

1.TaskStack 的功能

  • 管理任务和活动的栈顺序:任务栈负责维护任务栈中活动的顺序,栈底是任务栈最早的活动,栈顶是当前显示的活动。
  • 任务切换:当用户在任务之间切换时,任务栈管理任务栈的活动顺序,确保任务的上下文被保留。当用户返回到任务栈中的活动时,它们按用户切换的顺序恢复。
  • 清理和销毁:当一个任务完成并不再需要时,任务栈会销毁任务中的活动,释放资源。

2.TaskStack 与任务亲和性(taskAffinity

  • taskAffinity 是每个活动的一个属性,它决定了该活动是否与其他活动共享任务栈。默认情况下,活动的 taskAffinity 设置为其应用的包名,这意味着一个应用的活动通常会放入该应用的任务栈中。
  • 但通过修改 taskAffinity,可以使不同应用的活动共享同一个任务栈。例如,应用 A 的活动和应用 B 的活动可以被安排在同一个任务栈中,形成跨应用的任务。

3.launchMode 和任务栈的关系

launchMode(如 standardsingleTopsingleTasksingleInstance)影响一个活动是否会被添加到当前任务栈中,或者是否会启动新的任务栈。例如:

  • singleTask:如果一个活动以 singleTask 启动模式启动,它会在任务栈中查找是否已经有这个活动,如果有,它将复用任务栈并销毁当前栈中的其他活动。这使得活动可以跨应用存在于同一个任务中。
  • standard:每次启动都会在任务栈中创建新的实例。

三、ActivityStack

ActivityStack 代表一个 任务(Task) 中的活动栈。它用于管理一个任务中的所有活动,并按顺序维护这些活动的生命周期。每个活动栈的结构遵循典型的 后进先出(LIFO) 规则,即栈顶的活动是当前正在显示的活动,最底部的活动是任务栈中的第一个活动。

1. ActivityStackTaskStack 之间的关系:

  • ActivityStack:每个任务栈(TaskStack)对应一个活动栈(ActivityStack),用于管理单个任务中的活动(Activity)的入栈、出栈操作。ActivityStack 负责管理任务栈中活动的顺序和生命周期。
  • TaskStackTaskStack 是一个包含多个活动栈(ActivityStack)的集合。一个任务栈可以包含一个或多个活动栈。任务栈将活动栈组织在一起,表示一个特定的任务或应用的任务集合。

2. 新的活动压入栈的过程

  • 如果是启动同一个任务栈中的活动
    当应用启动一个新的活动,并且该活动属于同一个任务栈时,新的活动会被压入 ActivityStack 中。这意味着该活动会加入当前任务栈的活动栈中,活动栈的顺序会发生变化。

    • 例如:用户从应用 A 的主界面启动了一个新页面(例如设置界面)。这时,新的设置界面会被压入 ActivityStack 中,原本的主界面会被保留在活动栈中,新的活动会成为栈顶的活动。
  • 如果是启动一个新任务栈中的活动
    如果该活动属于一个新的任务栈,系统会 创建一个新的 TaskStack,并将新的活动压入这个新创建的栈中,同时也会建立一个新的 ActivityStack 来管理这个任务栈中的活动。

    • 例如:用户从应用 A 跳转到应用 B。如果应用 B 是独立的任务(或者没有共享 taskAffinity),那么应用 B 会启动一个新的任务栈,新的任务栈包含应用 B 的活动,并创建新的活动栈来管理应用 B 中的活动。