Xamarin.Android Activity 生命周期

17 Mar 2025 | 6 分钟阅读

Activity 是 Android 应用程序的构建块,它们可以存在于不同的状态。 Activity 生命周期从初始化开始,到终止结束。 Activity 生命周期包括应用程序初始化和终止之间的许多状态。 Activity 是 Android 应用程序中的单个页面,用户可以在其中执行交互。

Activity 状态

AndroidOS Activity 基于其状态。 Android 状态帮助 Android 识别不再使用的 activity。 Android 状态允许 操作系统 重新声明内存和资源。

该图显示了 activity 在其生命周期中可能经历的状态。

Xamarin.Android Activity LifeCycle

状态分为四组

  1. 活动或运行: 当 Activity 位于前台时,它们可以被认为是活动或正在运行。 活动或运行状态也称为 Activity 堆栈的顶部。 运行状态被称为 Android 中优先级最高的 Activity。 在极端情况下,当 Activity 尝试使用比操作系统中可用内存更多的内存时,此 Activity 可能会被终止。 在这种情况下,UI 变得无响应。
  2. 暂停: 当设备进入睡眠状态时,但 Activity 仍然可见,但被新的、非全尺寸或透明的 Activity 部分隐藏时,在这种情况下,Activity 被认为已暂停。 暂停的 Activity 仍然有效,即,它们保留所有状态和成员信息,并将保持附加到窗口管理器。 暂停是 Android 中第二高的优先级 Activity。 此 Activity 仅由操作系统终止。 此 Activity 满足保持 Activity 稳定和响应所需的资源要求。
  3. 停止/后台: 完全被另一个 Activity 覆盖的 Activity 可以被认为是停止或继续在后台。 停止的 Activity 尝试尽可能长时间地保留其状态,但停止的 Activity 始终被认为是所有三个状态中优先级最低的 Activity。 操作系统可以终止此状态下的 Activity,以满足优先级最高的 Activity 的资源要求。
  4. 重新启动: 在 Android 中,Activity 可能会从暂停到停止的状态从内存中删除。 如果我们要导航回 Activity,则必须重新启动它。 重新启动的 Activity 将恢复到其先前保存的状态,然后显示给用户。

Activity 生命周期方法

当用户浏览 Android 应用程序时,会发生一系列事件。 例如,当我们启动一个应用程序,例如 Facebook 应用程序,它会启动并显示在用户的前台,onCreate () → onStart () → onResume ()

如果任何其他 Activity 启动,例如:当有电话呼叫时,Facebook 应用程序将转到后台,并且呼叫到达前台。 现在我们有两个正在进行的过程。

当电话呼叫结束时,Facebook 应用程序返回到前台。 调用了三种方法。

Xamarin.Android 框架提供了一个强大的模型来管理应用程序中的 Activity 状态。 当 Activity 的状态发生变化时,Activity 会收到操作系统的通知,操作系统会调用该 Activity 上的特定方法。

以下是一些指定与 Activity 生命周期 关系的几种方法

作为开发人员,我们可以通过覆盖 Activity 内的方法来处理状态的变化。 在这里,我们必须注意到,所有生命周期方法都在 UI 线程上调用,并阻止操作系统执行下一个 UI 工作。 它将隐藏当前 Activity 并显示新的 Activity。 任何长时间运行的任务都应在后台线程上执行。

以下是生命周期方法及其用途

Xamarin.Android Activity LifeCycle

OnCreate: OnCreate 是创建任何 Activity 时调用的第一个方法。 OnCreate 始终被覆盖,以执行任何 Activity 所需的任何初始化,例如

  • 创建视图
  • 初始化变量
  • 将静态数据绑定到列表

OnCreate 接受 Bundle 参数,这是一个用于在 Activity 之间存储和传递状态和对象信息的字典。 如果包不为空,则表示 Activity 正在重新启动,它应该从上一个状态恢复其状态。

OnCreate 完成后,Android 将启动 OnStart。

OnStart: OnCreate 完成后,系统将调用 OnStart。 如果需要在任何 Activity 可见之前执行任何任务,则 Activity 可能会覆盖此方法。 OnStart 包括例如,刷新 Activity 内视图的当前值。 Android 将在 OnStart 之后调用 OnResume 方法。

OnResume: 当任何 Activity 准备好开始与用户交互时,系统将调用 OnResume。 Activity 应该覆盖此方法以执行任务。 这些任务是

  • 提高帧速率。
  • 启动动画
  • 侦听 GPS 更新
  • 它将显示相关警报,例如对话框或警报。
  • 连接外部事件处理程序。

在这里,我们将编写代码来展示如何初始化相机。

OnResume 很重要,因为在 OnPause 中完成的任何操作都应在 OnResume 中撤消。 它是我们在启动任何 Activity 之后执行的唯一方法。

OnPause: 当系统要将 Activity 放入后台或 Activity 不可见时,将调用 OnPause。 如果需要,Activity 应该覆盖 OnPause 方法

  • 将未保存的更改提交到持久性数据。
  • 消耗它应该清理或销毁其他对象的资源。
  • 降低帧速率并暂停动画。
  • 取消注册外部事件处理程序或通知处理程序。 必须这样做才能防止 Activity 中的内存泄漏。
  • 如果 Activity 显示任何对话框或警报,则必须使用 .Dismiss 方法将其清理掉。

示例:在此示例中,我们释放相机。 在暂停期间,Activity 无法使用它。

以下是在 OnPause 之后调用的两个生命周期方法。

  1. 如果 Activity 返回到前台,将调用 OnResume。
  2. 当 Activity 放入后台时,将调用 OnStop。

OnStop: 当 Activity 不可见时,在这种情况下,我们将使用 OnStop。 此 Activity 发生在以下情况下

  1. 当启动新的 Activity 时。
  2. 当现有 Activity 返回到前台时。
  3. 当 Activity 被销毁时。

当 Android 需要内存资源且无法在后台执行 Activity 时,在低内存的情况下,OnStop 无法被调用。 这就是我们无法依赖 OnStop 的原因,因为我们计划终止任何 Activity。

在此之后可以调用的下一个生命周期方法将是 OnDestroy,如果 Activity 正在运行,而 OnRestart 将用于 Activity 正在返回进行交互。

OnDestroy: OnDestroy 是在 Activity 实例被销毁并从内存中完全删除之前在 Activity 实例上调用的最终方法。 在极端情况下,Android 可能会杀死 Activity 的托管进程,导致 OnDestroy 未实现。 大多数情况下,Activity 不会执行此方法,因为主要清理和关闭已在 OnPause 或 OnStop 方法中完成。

通常会覆盖 OnDestroy 方法以清理可能泄漏资源的长时间运行的资源。

例如,这是在 OnCreate 中启动的后台线程。 在 Activity 被销毁之后,将没有生命周期方法。

OnRestart: OnRestart 在停止 Activity 后但在恢复它之前被调用。

示例,当用户在应用程序中的 Activity 上按下主页按钮时。 发生这种情况时,将调用 OnPause,然后调用 OnStop,并且 Activity 移至后台,但未被销毁。 如果我们要重新安装应用程序,则使用任务管理器或类似的应用程序,Android 将调用 Activity 的 OnRestart 方法。

OnStart 将是在 OnRestart 之后调用的下一个生命周期方法。

总结

Android Activity 生命周期为应用程序内的状态管理活动提供了一个强大的框架,但是理解和实现它可能很困难。