返回

打造无缝的 Activity 启动体验(下):深入探索生命周期回调

Android

Activity 启动流程:生命周期回调剖析

作为一名 Android 开发人员,了解 Activity 启动流程对于构建流畅高效的应用程序至关重要。在前一篇文章中,我们深入探讨了流程的前半部分,包括从创建 Intent 到调用 ActivityThread.performLaunchActivity() 的过程。现在,让我们继续探索流程的后半部分,并深入研究 Activity 生命周期回调。

Activity 的生命周期回调

Activity 生命周期回调是一系列方法,它们在 Activity 的生命周期中特定的时刻调用。这些回调允许开发者在 Activity 的状态发生变化时执行特定任务,例如恢复 UI 或释放资源。

resumeTopActivityInnerLocked

resumeTopActivityInnerLocked() 是 Activity 启动流程的关键方法。它负责恢复先前暂停的 Activity,并为其执行必要的生命周期回调。此方法将接收一个 ActivityRecord 作为参数,该 ActivityRecord 代表要恢复的 Activity。

resumeTopActivityInnerLocked() 方法包含以下主要步骤:

  • 检查 Activity 状态: 它首先检查 Activity 是否处于 RESUMED 状态。如果是,则直接返回,因为 Activity 已处于活动状态。
  • 执行生命周期回调: 如果 Activity 未处于 RESUMED 状态,则执行以下生命周期回调:
    • onPause():暂停当前处于活动状态的 Activity。
    • onStart():启动要恢复的 Activity。
    • onResume():恢复要恢复的 Activity。
  • 更新 Activity 栈: 它将恢复的 Activity 置于 Activity 栈的顶部,并更新 Activity 栈的状态。

生命周期回调剖析

onResume()

onResume() 生命周期回调表示 Activity 已完全可见并且与用户交互。它是执行与用户交互相关的任务的理想时机,例如更新 UI、加载数据或播放音乐。需要注意的是,onResume() 回调不应执行耗时任务,因为这可能会导致 UI 卡顿或 ANR(应用程序未响应)。

onPause()

onPause() 生命周期回调表示 Activity 已暂停,但仍保留在内存中。通常,当另一个 Activity 启动或设备进入睡眠状态时,会调用 onPause() 回调。在 onPause() 回调中,应暂停与用户交互无关的任务,例如停止动画或保存用户数据。

onStart()

onStart() 生命周期回调表示 Activity 已可见但尚未与用户交互。它通常在 Activity 启动后或当它从暂停状态恢复后调用。在 onStart() 回调中,应执行不需要与用户交互的任务,例如注册广播接收器或启动后台服务。

onStop()

onStop() 生命周期回调表示 Activity 不再可见。它通常在 Activity 被另一个 Activity 覆盖或设备进入睡眠状态时调用。在 onStop() 回调中,应停止与用户交互无关的任务,例如注销广播接收器或停止后台服务。

onDestroy()

onDestroy() 生命周期回调表示 Activity 已被销毁并从内存中删除。它通常在 Activity 不再需要时调用。在 onDestroy() 回调中,应释放 Activity 持有的所有资源,例如关闭数据库连接或取消注册广播接收器。

常见问题解答

  1. 为什么 onStart() 回调在 Activity 可见之前调用?
    onStart() 回调在 Activity 可见之前调用,以便在 Activity 与用户交互之前执行必需的初始化任务。

  2. 在 onResume() 回调中执行耗时任务会有什么后果?
    在 onResume() 回调中执行耗时任务会延迟 Activity 的恢复过程,导致 UI 卡顿或 ANR。

  3. onPause() 回调是否总是在 onStop() 回调之前调用?
    是的,onPause() 回调总是在 onStop() 回调之前调用。

  4. onDestroy() 回调在 Activity 从内存中删除后调用吗?
    是的,onDestroy() 回调在 Activity 从内存中删除后调用。

  5. 哪些生命周期回调最适合执行与用户交互无关的任务?
    onStart() 和 onStop() 生命周期回调最适合执行与用户交互无关的任务。