Chat
Ask me anything
Ithy Logo
Sign in to save

深入理解 Android Activity 的 onResume() 方法

揭示 Activity 生命周期中的关键时刻及其应用场景

android-activity-onresume-method-tlo184a2

核心亮点

  • onResume() 方法是 Android Activity 生命周期中的一个重要回调,标志着 Activity 进入“Resumed”状态,此时 Activity 位于屏幕最前端,用户可以与其进行交互。
  • onResume() 会在 Activity 首次创建后、从后台返回前台时,或从 Paused 状态恢复时被调用。
  • 在 onResume() 中通常会执行需要 Activity 处于前台并具有焦点的操作,例如启动动画、初始化独占性资源(如相机)以及恢复在 onPause() 中暂停的 UI 更新和线程。

Activity 生命周期概述

在 Android 开发中,Activity 是用户与应用程序交互的基本构建块。每个 Activity 都有一个生命周期,由一系列回调方法定义,系统会在 Activity 的状态发生变化时调用这些方法。理解 Activity 的生命周期对于构建健壮且响应迅速的 Android 应用程序至关重要。Activity 的核心生命周期回调方法包括:onCreate(), onStart(), onResume(), onPause(), onStop(), 和 onDestroy()。这些方法构成了 Activity 从创建到销毁的整个过程。

Activity 的生命周期状态如下图所示:

Android Activity Lifecycle Diagram

图解 Android Activity 生命周期

这张图清晰地展示了 Activity 在不同状态之间的转换以及对应的回调方法。了解这些状态和回调有助于开发者在适当的时机执行相应的操作。


onResume() 方法的角色与调用时机

onResume() 方法是 Android Activity 生命周期中的一个关键回调,它在 Activity 进入“Resumed”状态时被调用。当 Activity 处于 Resumed 状态时,它位于屏幕的最前端,具有用户焦点,并且用户可以与它进行完全的交互。这个状态也被称为“运行中”状态。

onResume() 的调用场景

onResume() 方法在多种情况下会被系统调用:

Activity 首次创建后

当 Activity 首次启动时,生命周期方法的调用顺序通常是 onCreate() -> onStart() -> onResume()。在 onCreate() 中进行一次性的初始化工作,onStart() 使 Activity 对用户可见,而 onResume() 则使 Activity 获得焦点并准备好与用户交互。

从后台返回前台

当用户按下 Home 键将应用发送到后台,或者启动另一个完全覆盖当前 Activity 的 Activity 时,当前 Activity 会依次进入 Paused 状态(调用 onPause())和 Stopped 状态(调用 onStop())。当用户通过最近任务列表或应用图标重新启动应用并返回到该 Activity 时,系统会调用 onRestart() -> onStart() -> onResume()。

从 Paused 状态恢复

有时 Activity 可能会进入 Paused 状态但仍然部分可见,例如当一个透明的 Activity 或对话框出现在其上方时。在这种情况下,当前 Activity 会调用 onPause()。当覆盖的 Activity 或对话框被关闭,当前 Activity 重新获得焦点并回到前台时,系统会直接调用 onResume() 方法,而不会经过 onRestart() 和 onStart()。

总结来说,onResume() 方法在 Activity 每次进入前台并获得用户焦点时都会被调用。


在 onResume() 中执行的操作

由于 onResume() 标志着 Activity 处于用户可交互的状态,因此通常在这个方法中执行那些需要在 Activity 可见并具有焦点时进行的初始化或恢复操作。以下是一些在 onResume() 中常见的操作:

恢复 UI 更新和动画

在 onPause() 中暂停的 UI 动画、游戏循环或其他需要持续更新屏幕的操作,应该在 onResume() 中恢复。这是确保应用在用户回到 Activity 时能够流畅运行的关键。

初始化独占性资源

一些硬件资源,如相机或传感器,通常是独占性的,即同一时间只能被一个应用访问。为了避免资源冲突,应该在 onResume() 中获取和初始化这些资源,并在 onPause() 中释放它们。这样可以确保只有当前活跃的 Activity 才能访问这些资源。

注册广播接收器或其他系统服务

如果在 Activity 可见时需要接收特定的广播(例如电量变化、网络状态变化),或者需要注册监听器来接收系统服务的更新(例如位置更新),可以在 onResume() 中注册相应的接收器或监听器,并在 onPause() 中取消注册,以避免在 Activity 不可见时浪费系统资源或引起内存泄漏。

恢复网络请求或线程

如果在 Activity 可见时需要进行持续的网络请求或运行后台线程来更新 UI,可以在 onResume() 中启动或恢复这些操作。同样地,为了节省资源,应该在 onPause() 中暂停或取消这些操作。

处理购买流程

对于涉及应用内购买的应用,通常建议在 onResume() 中调用 BillingClient.queryPurchasesAsync() 来确保所有未完成的购买都被正确处理。


onResume() 与 onCreate() 的关系

尽管在 Activity 首次创建时 onResume() 会在 onCreate() 之后被调用,但它们的作用不同。onCreate() 方法只在 Activity 首次创建时调用一次,用于执行一次性的初始化设置,如设置布局、初始化视图和数据绑定等。而 onResume() 方法则在 Activity 每次进入前台并获得焦点时都会调用,用于执行需要 Activity 活跃时进行的恢复和初始化操作。

因此,不应该在 onResume() 中执行只需要进行一次的初始化操作,否则可能会导致重复执行和不必要的开销。反之,也不应该在 onCreate() 中执行需要在 Activity 每次回到前台时都进行的恢复操作。

下表总结了 onCreate() 和 onResume() 的主要区别:

回调方法 调用时机 典型用途
onCreate() Activity 首次创建时调用一次 一次性初始化,如设置布局、初始化视图、数据绑定
onResume() Activity 每次进入前台并获得焦点时调用 恢复暂停的操作、初始化独占性资源、注册监听器、启动动画

onCreate() 与 onResume() 对比


onResume() 的注意事项

在使用 onResume() 方法时,需要注意以下几点:

避免执行耗时操作

onResume() 方法在主线程中执行,耗时的操作会阻塞主线程,导致界面卡顿甚至 ANR(Application Not Responding)。因此,任何可能耗时的操作(如网络请求、复杂的数据库查询)都应该在后台线程中执行,而不是直接放在 onResume() 中。

与 onPause() 配对使用

通常,在 onResume() 中初始化的资源或注册的监听器应该在 onPause() 中释放或取消注册。这是为了在 Activity 进入后台或失去焦点时停止不必要的活动,节省系统资源,并防止内存泄漏。onPause() 是在 Activity 即将失去焦点时调用的第一个方法,适合进行轻量级的清理工作。

Fragment 的 onResume()

Fragment 也有自己的生命周期,其 onResume() 方法在 Fragment 关联的 Activity 进入 Resumed 状态且 Fragment 自身对用户可见并获得焦点时调用。Fragment 的生命周期与宿主 Activity 的生命周期紧密相关,理解 Fragment 的生命周期回调与 Activity 回调之间的关系对于正确管理 Fragment 至关重要。


Activity 生命周期视频资源

为了更直观地理解 Android Activity 的生命周期,特别是 onResume() 方法,可以参考以下视频:

Lifecycle of Activity - Android Activity Lifecycle Callbacks

这个视频详细讲解了 Android Activity 的生命周期回调方法,包括 onCreate, onStart, onResume, onPause, onStop, onDestroy,有助于加深对 onResume() 在整个生命周期中所处位置的理解。


常见问题解答 (FAQ)

onResume() 方法会在哪些情况下被调用?

onResume() 方法会在 Activity 首次创建后、从后台返回前台时,以及从 Paused 状态恢复时被调用。简单来说,每当 Activity 进入前台并获得用户焦点时,都会调用 onResume()。

我应该在 onResume() 中执行哪些类型的操作?

在 onResume() 中应该执行那些需要 Activity 处于前台并具有焦点的操作,例如恢复 UI 更新和动画、初始化独占性资源(如相机)、注册广播接收器或系统服务监听器,以及恢复网络请求或线程等。

onResume() 和 onCreate() 有什么区别?

onCreate() 只在 Activity 首次创建时调用一次,用于一次性初始化;而 onResume() 在 Activity 每次进入前台并获得焦点时都会调用,用于恢复和初始化需要在 Activity 活跃时进行的操作。

Fragment 的 onResume() 方法何时调用?

Fragment 的 onResume() 方法在 Fragment 关联的 Activity 进入 Resumed 状态且 Fragment 自身对用户可见并获得焦点时调用。

在 onResume() 中执行耗时操作会有什么问题?

在 onResume() 中执行耗时操作会阻塞主线程,导致界面卡顿或 ANR。所有耗时操作都应该在后台线程中执行。

onPause() 方法与 onResume() 方法有什么关系?

onPause() 方法是 onResume() 的对应方法,在 Activity 即将失去焦点时调用。通常在 onResume() 中初始化的资源或注册的监听器应该在 onPause() 中释放或取消注册。


参考资料


Last updated April 19, 2025

AI-assisted research. Sources, methodology and corrections · Source-checked guides and tools · Explore published answers

Ask Ithy AI
Download Article
Delete Article