返回

全面解析 Activity 启动过程(第二部分)

Android

AMS:Activity 管理器服务

AMS(Activity Manager Service)是 Android 系统中负责管理 Activity 的核心服务。它的主要职责包括:

  • 管理 Activity 的生命周期: AMS 负责创建、启动、停止和销毁 Activity。
  • 维护 Activity 的状态: AMS 负责保存和恢复 Activity 的状态,以便在 Activity 重新启动时能够恢复到上次的状态。
  • 管理 Activity 之间的通信: AMS 负责管理 Activity 之间的通信,包括启动请求、结果返回和 Intent 广播。
  • 管理 Activity 的启动模式和启动标志: AMS 负责管理 Activity 的启动模式和启动标志,以确定 Activity 的启动行为。

PMS:包管理器服务

PMS(Package Manager Service)是 Android 系统中负责管理应用程序和组件的服务。它的主要职责包括:

  • 管理应用程序的安装和卸载: PMS 负责管理应用程序的安装和卸载,以及应用程序的版本管理。
  • 管理应用程序的权限: PMS 负责管理应用程序的权限,以及应用程序之间的权限授予和撤销。
  • 管理应用程序的组件: PMS 负责管理应用程序的组件,包括 Activity、Service、BroadcastReceiver 和 ContentProvider。
  • 管理应用程序的签名: PMS 负责管理应用程序的签名,并确保应用程序的签名在安装时与之前一致。

WMS:窗口管理器服务

WMS(Window Manager Service)是 Android 系统中负责管理窗口的服务。它的主要职责包括:

  • 管理窗口的创建和销毁: WMS 负责创建和销毁窗口,以及窗口的属性设置。
  • 管理窗口的布局: WMS 负责管理窗口的布局,包括窗口的位置、大小和 Z 轴顺序。
  • 管理窗口的显示和隐藏: WMS 负责管理窗口的显示和隐藏,以及窗口的透明度设置。
  • 管理窗口的动画: WMS 负责管理窗口的动画,包括窗口的进入和退出动画。

Activity 的启动模式

Activity 的启动模式决定了 Activity 在启动时如何与现有的 Activity 进行交互。Android 系统提供了四种 Activity 的启动模式:

  • standard: 标准模式,这是默认的启动模式。如果要启动的 Activity 已经存在于任务栈中,则系统会将该 Activity 移至任务栈的顶部,并调用其 onResume() 方法。如果要启动的 Activity 不存在于任务栈中,则系统会创建一个新的 Activity 并将其添加到任务栈的顶部。
  • singleTop: 单顶模式,如果要启动的 Activity 已经存在于任务栈的顶部,则系统会调用其 onNewIntent() 方法。如果要启动的 Activity 不存在于任务栈中,则系统会创建一个新的 Activity 并将其添加到任务栈的顶部。
  • singleTask: 单任务模式,如果要启动的 Activity 已经存在于任务栈中,则系统会将该 Activity 移至任务栈的顶部,并调用其 onNewIntent() 方法。如果要启动的 Activity 不存在于任务栈中,则系统会创建一个新的 Activity 并将其添加到任务栈的顶部,同时会将该 Activity 之前的所有 Activity 从任务栈中移除。
  • singleInstance: 单实例模式,如果要启动的 Activity 已经存在于任务栈中,则系统会调用其 onNewIntent() 方法。如果要启动的 Activity 不存在于任务栈中,则系统会创建一个新的 Activity 并将其添加到任务栈的顶部,同时会将该 Activity 之前的所有 Activity 从任务栈中移除。与单任务模式不同的是,单实例模式不允许在任务栈中创建多个实例。

Activity 的启动标志

Activity 的启动标志可以用来控制 Activity 的启动行为。Android 系统提供了多种 Activity 的启动标志,其中最常用的包括:

  • FLAG_ACTIVITY_NEW_TASK: 创建一个新的任务栈并启动 Activity。
  • FLAG_ACTIVITY_CLEAR_TOP: 将当前任务栈中的所有 Activity 从任务栈中移除,并启动 Activity。
  • FLAG_ACTIVITY_SINGLE_TOP: 如果 Activity 已经存在于任务栈的顶部,则调用其 onNewIntent() 方法,否则创建一个新的 Activity 并将其添加到任务栈的顶部。
  • FLAG_ACTIVITY_CLEAR_TASK: 将当前任务栈中的所有 Activity 从任务栈中移除,并启动 Activity,同时会将该 Activity 之前的所有 Activity 从任务栈中移除。
  • FLAG_ACTIVITY_NO_HISTORY: 启动 Activity 后不将其添加到任务栈中。

Activity 的启动动画

Activity 的启动动画可以用来美化 Activity 的启动过程,并为用户提供更好的视觉体验。Android 系统提供了多种 Activity 的启动动画,其中最常用的包括:

  • fade_in: 淡入动画,Activity 从透明逐渐变为不透明。
  • fade_out: 淡出动画,Activity 从不透明逐渐变为透明。
  • slide_in_left: 从屏幕左侧滑入动画,Activity 从屏幕左侧逐渐移至屏幕中间。
  • slide_in_right: 从屏幕右侧滑入动画,Activity 从屏幕右侧逐渐移至屏幕中间。
  • slide_in_top: 从屏幕顶部滑入动画,Activity 从屏幕顶部逐渐移至屏幕中间。
  • slide_in_bottom: 从屏幕底部滑入动画,Activity 从屏幕底部逐渐移至屏幕中间。

如何优化 Activity 的启动过程

为了提高应用的性能和用户体验,可以对 Activity 的启动过程进行优化。以下是一些常见的 Activity 启动过程优化技巧:

  • 避免在 Activity 中执行耗时操作: 在 Activity 中执行耗时操作会导致 Activity 启动变慢。应尽量将耗时操作放在后台线程中执行。
  • 使用启动标志优化 Activity 启动行为: 合理使用 Activity 的启动标志可以优化 Activity 的启动行为,例如可以使用 FLAG_ACTIVITY_NO_HISTORY 启动标志来避免将 Activity 添加到任务栈中。
  • 使用启动动画优化 Activity 启动体验: 合理使用 Activity 的启动动画可以美化 Activity 的启动过程,并为用户提供更好的视觉体验。
  • 使用预加载优化 Activity 启动速度: 可以预加载 Activity 所需的数据和资源,以加快 Activity 的启动速度。

结语

通过本文,我们对 Android Activity 的启动过程有了更深入的了解。包括了 AMS、PMS 和 WMS 的工作流程,以及 Activity 的启动模式、启动标志和启动动画的详细解析。同时,还探讨了如何优化 Activity 的启动过程,以提高应用的性能和用户体验。