安卓Activity生命周期各阶段何时触发?

99ANYc3cd6
预计阅读时长 22 分钟
位置: 首页 安卓 正文

什么是 Activity 生命周期?

Activity 生命周期指的是一个 Activity 从创建、显示、隐藏、销毁的整个过程中,系统会回调其内部一系列特定方法,开发者可以重写这些方法,来执行相应的逻辑,比如在 Activity 显示时加载数据,在隐藏时保存状态,在销毁时释放资源等。

安卓activity生命周期
(图片来源网络,侵删)

理解生命周期对于编写稳定、流畅、不耗电的 App 至关重要。


生命周期核心方法

一个 Activity 类中,有 7 个核心的生命周期回调方法,我们可以将它们分为三组:

第一组:创建与显示

当 Activity 第一次被创建并显示到屏幕上时,系统会按以下顺序调用这些方法:

  1. onCreate(Bundle savedInstanceState)

    安卓activity生命周期
    (图片来源网络,侵删)
    • 调用时机:Activity 实例被创建时调用,这是整个生命周期的入口,只会调用一次。
    • 主要作用
      • 进行 Activity 的初始化工作:加载布局文件 (setContentView)、初始化 UI 组件、绑定数据等。
      • savedInstanceState 不为 null,说明 Activity 是因为系统配置(如屏幕旋转)被销毁后重建的,此时需要从 savedInstanceState 中恢复之前保存的状态。
    • 示例
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState); // 必须调用
          setContentView(R.layout.activity_main); // 加载布局
          // 初始化其他组件...
      }
  2. onStart()

    • 调用时机:在 onCreate() 之后,或者 Activity 从不可见变为可见时调用。
    • 主要作用:Activity 已经对用户可见了,但可能还没有出现在前台(比如被一个对话框遮挡了一部分),通常在这里做一些轻量级的操作,比如注册一个广播接收器来监听网络变化(注意:在 onStop() 时要注销)。
    • 注意:Activity 还不能与用户交互。
  3. onResume()

    • 调用时机:在 onStart() 之后,Activity 位于前台并可以与用户交互时调用。
    • 主要作用:这是 Activity 与用户交互的黄金时期,在这里启动相机、开始动画、播放音乐、或者获取用户焦点等操作。
    • 特点:当一个 Activity 位于前台时,它始终处于 onResume() 状态。

第二组:后台与隐藏

当用户离开当前 Activity,比如按下 Home 键、打开一个新的 Activity、或者切换到另一个 App 时,系统会调用以下方法:

  1. onPause()

    安卓activity生命周期
    (图片来源网络,侵删)
    • 调用时机:当系统准备启动或恢复另一个 Activity 时调用。这是生命周期中最重要的一个回调
    • 主要作用
      • 快速、轻量级地保存关键数据,因为 onPause() 必须在下一个 Activity 显示之前返回,所以不能执行耗时操作(如网络请求、大文件读写)。
      • 停止动画或暂停视频/音乐播放,因为当前 Activity 即将不再对用户可见。
      • 释放 Camera 等系统资源,以免被新 Activity 使用时发生冲突。
    • 示例
      @Override
      protected void onPause() {
          super.onPause();
          // 暂停视频播放
          videoView.pause();
          // 释放相机资源
          if (camera != null) {
              camera.release();
          }
      }
  2. onStop()

    • 调用时机:当 Activity 完全不可见时调用(一个新的 Activity 完全覆盖了它,或者用户按了 Home 键)。
    • 主要作用
      • 停止所有消耗 CPU 的操作,比如停止动画、停止后台线程、注销在 onStart() 中注册的广播接收器等,以节省电量。
      • Activity 实例仍然存在于内存中,系统可以将其快速恢复。
    • onPause() 的区别onPause() 是 Activity 即将失去焦点时的回调,而 onStop() 是 Activity 完全从屏幕上消失时的回调。

第三组:销毁与销毁前

当 Activity 不再需要时,系统会调用以下方法来销毁它:

  1. onDestroy()
    • 调用时机:在 Activity 被销毁前调用,这是生命周期中的最后一个回调。
    • 主要作用释放所有资源,在 onCreate() 中创建的线程、打开的数据库连接、注册的全局监听器等,都应该在这里进行清理和释放,防止内存泄漏。
    • 示例
      @Override
      protected void onDestroy() {
          super.onDestroy();
          // 停止并移除所有后台任务
          myExecutor.shutdown();
          // 注销全局监听器
          unregisterReceiver(myReceiver);
      }

可选方法:恢复状态

  1. onRestoreInstanceState(Bundle savedInstanceState)
    • 调用时机:在 onCreate() 之后,onStart() 之前调用,只有当 Activity 因为配置变更(如屏幕旋转)被销毁并重建时,才会被调用。
    • 主要作用:与 onSaveInstanceState() 配合使用,用于恢复 UI 状态,恢复 EditText 中用户输入的文本、ScrollView 的滚动位置、ListView 的滚动状态等。
    • onCreate() 的区别onCreate()savedInstanceState 可能为 null(例如冷启动 App),而 onRestoreInstanceState() 只有在恢复时才会被调用,所以可以更安全地在这里恢复 UI 状态。
    • 对应的保存方法onSaveInstanceState(Bundle outState),它在 onStop() 之前被调用。

生命周期图解

一张图胜过千言万语,这是官方提供的经典生命周期图:

       [ Main Thread ]
         +----------------+
         |    onCreate()  |
         +----------------+
                 |
                 v
         +----------------+
         |    onStart()   |
         +----------------+
                 |
                 v
         +----------------+
         |   onResume()   |  <-- Activity is now in the foreground
         +----------------+      and interacting with the user
                 |
                 |     (User navigates away)
                 v
         +----------------+
         |    onPause()   |  <-- About to lose focus
         +----------------+
                 |
                 |     (Fully hidden from user)
                 v
         +----------------+
         |    onStop()    |
         +----------------+
                 |
                 |     (Activity is finished or killed by system)
                 v
         +----------------+
         |   onDestroy()  |
         +----------------+
                 |
                 v
         [ Garbage Collected ]

典型场景下的生命周期调用流程

理解单个方法很重要,但更重要的是理解它们在不同场景下的组合调用。

场景 1:冷启动 App,打开 Activity A

ActivityA: onCreate()onStart()onResume()

场景 2:从 Activity A 跳转到 Activity B

  • ActivityA: onPause()(系统处理 B 的创建和显示)onStop()
  • ActivityB: onCreate()onStart()onResume()

注意onPause() 必须在 onResume() 之前返回,Activity B 的 onResume() 会在 Activity A 的 onPause() 完全执行后才开始,这保证了界面切换的流畅性。

场景 3:用户按下 Home 键,从 Activity A 回到桌面

  • ActivityA: onPause()onStop()

场景 4:从桌面点击 App 图标,回到 Activity A

  • ActivityA: onRestart()onStart()onResume()

注意:这里调用了 onRestart(),它是在 onStop() 之后,onStart() 之前调用的,表示 Activity 正在从停止状态重新启动。

场景 5:在 Activity A 中,旋转屏幕(横竖屏切换)

这是最常见的需要处理状态保存的场景。

  1. 销毁阶段:

    • 系统首先调用 onPause()onStop()
    • 然后调用 onSaveInstanceState(outState),在这里你可以保存 UI 状态(EditText 的内容)。
    • 最后调用 onDestroy(),Activity A 被销毁。
  2. 重建阶段:

    • 系统重新创建 Activity A 的实例。
    • 调用 onCreate(savedInstanceState)savedInstanceState 中包含了之前保存的数据。
    • 调用 onRestoreInstanceState(savedInstanceState),在这里你可以恢复 UI 状态。
    • 调用 onStart()onResume()

最佳实践与注意事项

  1. 永远不要在 onPause() 中执行耗时操作:这会直接拖慢 UI 线程,导致界面卡顿,甚至可能被系统 ANR (Application Not Responding)。
  2. onStop() 中停止耗电操作:这是释放资源、节省电力的最佳时机。
  3. onDestroy() 中彻底清理资源:防止内存泄漏,特别是对于单例、静态变量持有的 Context 或 View。
  4. 合理使用 onSaveInstanceState():它主要用于保存临时 UI 状态,而不是持久化数据(比如用户填写表单后点击“保存”按钮,应该用数据库或网络 API,而不是 onSaveInstanceState),因为它不是 100% 可靠的,在某些极端情况下(如内存不足时)可能不会被调用。
  5. super 调用:在重写生命周期方法时,第一行代码必须是 super.onCreate(savedInstanceState) 等,这确保了父类(通常是 ActivityAppCompatActivity)能完成其内部的初始化工作。
方法 主要作用 是否可被杀死 何时使用
onCreate() 初始化,加载布局 Activity 创建时,一次性工作
onStart() Activity 变为可见 准备显示,开始注册轻量级监听
onResume() Activity 位于前台,可交互 启动动画、相机、音乐等
onPause() 即将失去焦点 快速保存数据、暂停动画、释放资源
onStop() Activity 完全不可见 停止耗电操作、注销监听器
onDestroy() Activity 即将被销毁 释放所有资源,防止内存泄漏
onSaveInstanceState() 保存临时 UI 状态 onStop() 前,用于屏幕旋转等恢复
onRestoreInstanceState() 恢复临时 UI 状态 onCreate() 后,用于恢复 UI

掌握 Activity 生命周期是成为一名合格 Android 开发者的必经之路,多画图、多实践、多调试,很快你就能熟练运用它了。

-- 展开阅读全文 --
头像
360软件管家电脑版官方下载哪里找?
« 上一篇 12-04
苹果电脑和手机如何快速同步数据?
下一篇 » 12-04

相关文章

取消
微信二维码
支付宝二维码

最近发表

标签列表

目录[+]