🥳 Activity - 图1

本质

  • 对于 开发者 来讲:Activity 是视图控制器,开发者可通过控制 View 以想要的方式进行排版
  • 对于 系统 来讲:Activity 是被管理的窗口
  • 对于 应用开发 的角度来讲:开发者通过继承 Activity ,拿到简练的模板

关于 Activity 的使用,官方文档中有详细介绍;关于 Activity 的设计缘由,重学安卓中有一篇非常好的文章:

生命周期

本质

基于窗体事件的编程,显示模式对应/绑定窗体事件的其中几种,方便开发者有机会在窗口创建/销毁期间每个节点,完成必要操作。

进程模式及进程优先级

移动设备的资源有限,因此系统对进程按照 重要性 进行了分级以合理分配系统资源。

详细内容参见 :

Activity 官方文档:进程和生命周期
Android Detail:进程篇——进程内存分配与优先级

状态管理

多窗口跳转

扔物线在 B 站上有一个关于 Activity Task 的视频,可以直观地建立感性认识:

点击查看【bilibili】

这部分内容需要理解 Android 中 Task 以及多任务切换**的概念,可以参考**

Android Detail:官方文档不是圣经,老生常谈的 Activity 任务,返回栈

从使用形式上看, Android 为开发者提供了两种管理 Task 的方式:

  • 使用 Manifest 中<activity>标签中的属性来管理
    • taskAffinity
    • launchMode
    • allowTaskReparenting
    • clearTaskOnLaunch
    • alwaysRetainTaskState
    • finishOnTaskLaunch
  • 在调用startActivity()时通过配置 intent 中的flag来管理
    • FLAG_ACTIVITY_NEW_TASK
    • FLAG_ACTIVITY_CLEAR_TOP
    • FLAG_ACTIVITY_SINGLE_TOP

启动模式(launch mode)

启动模式描述了 Activity 与 任务的关联方式,系统提供了四种启动模式:standardsingleTopsingleTasksingleInstance

为了解决 Activity 在 Task 中的复用问题,Android 设计了 launchMode。

launchMode 可以 manifest 文件中配置,例如:

  1. <activity android:name=".TestActivity"
  2. android:launchMode="singleTask" />

**
启动模式是 standardsingleTop 的 Activity 可以被多次实例化,其实例可以属于任何 Task,而且可以在栈中的任何位置。

通常情况下它们会被放入调用 startActivity 所在的 Task 中(除非 Intent 中包含 FLAG_ACTIVITY_NEW_TASK 的 flag,此种情况下与 taskAffinity 的配置有关)。

启动模式是 singleTasksingleInstance 的 Activity 只能被实例化一次(销毁后再次打开并创建不计,这里侧重同一时间只能有一个实例),换句话说,全局一次只会有一个这样的 Activity 实例(
虽然官方文档如此描述,但该行为有例外)。singleTasksingleInstance 的唯一区别是 singleTask 允许其他 Activity 与其共享 Task,而 singleInstance 是其 Task 的唯一成员。

不要将启动模式与 Intent 中的 flag 混淆!

Intent flag

除了 lauchMode,Android 还允许在调用 startActivity 时配置 Intent Flag 来对任务进行管理。

Android 中的 Intent flag 可参见 官方文档:Intent flag

启动模式与 Intent flag 的关系

launchMode 主要为了解决 Activity 在 Task 中的复用问题,而 Intent Flag 不仅可以管理 Task,还可以配置其他的信息,例如 FLAG_DEBUG_LOG_RESOLUTION 可以配置是否开启 log 信息。
因此它们功能上的交集是在对 Task 的管理,其中 launchMode 侧重于 Activity 的复用,而 Flag 对 Task 的管理更加全面。

此外 launchMode 的行为可以通过 Intent Flag 的改变:
**

Intent.FLAG_ACTIVITY_SINGLE_TOP, Intent.FLAG_ACTIVITY_NEW_TASKIntent.FLAG_ACTIVITY_MULTIPLE_TASK 使用这些 Flag 可以改变 launchMode 的行为

taskAffinity

Affinity 一词具有「亲和性,吸引力」的意思,TaskAffinity 代表着 Activity 倾向于哪个 Task(注意:是倾向,该属性不是指定 activity 在哪个 Task 中运行)。

TaskAffinity 可在两种情况下发挥作用:

  • 当启动 Activity 的 intent 包含 FLAG_ACTIVITY_NEW_TASK 标记时
    如果传递给 startActivity() 的 intent 包含 FLAG_ACTIVITY_NEW_TASK 标记,则系统会寻找其他 Task 来容纳新 Activity,通常会是一个新的 Task,但也未必。
    如果已存在与新 Activity 具有相同 taskAffinity 的现有 Task,则会将 Activity 启动到该 Task 中。如果不存在,则会启动一个新 Task。

  • 当 Activity 的 allowTaskReparenting 属性设为 "true"

在这种情况下,一旦和 Activity 有相同 TaskAffinity 的 Task 进入前台运行,Activity 就可从其启动的 Task 转移到该 Task。