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

理解生命周期对于编写稳定、流畅、不耗电的 App 至关重要。
生命周期核心方法
一个 Activity 类中,有 7 个核心的生命周期回调方法,我们可以将它们分为三组:
第一组:创建与显示
当 Activity 第一次被创建并显示到屏幕上时,系统会按以下顺序调用这些方法:
-
onCreate(Bundle savedInstanceState)
(图片来源网络,侵删)- 调用时机:Activity 实例被创建时调用,这是整个生命周期的入口,只会调用一次。
- 主要作用:
- 进行 Activity 的初始化工作:加载布局文件 (
setContentView)、初始化 UI 组件、绑定数据等。 savedInstanceState不为null,说明 Activity 是因为系统配置(如屏幕旋转)被销毁后重建的,此时需要从savedInstanceState中恢复之前保存的状态。
- 进行 Activity 的初始化工作:加载布局文件 (
- 示例:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 必须调用 setContentView(R.layout.activity_main); // 加载布局 // 初始化其他组件... }
-
onStart()- 调用时机:在
onCreate()之后,或者 Activity 从不可见变为可见时调用。 - 主要作用:Activity 已经对用户可见了,但可能还没有出现在前台(比如被一个对话框遮挡了一部分),通常在这里做一些轻量级的操作,比如注册一个广播接收器来监听网络变化(注意:在
onStop()时要注销)。 - 注意:Activity 还不能与用户交互。
- 调用时机:在
-
onResume()- 调用时机:在
onStart()之后,Activity 位于前台并可以与用户交互时调用。 - 主要作用:这是 Activity 与用户交互的黄金时期,在这里启动相机、开始动画、播放音乐、或者获取用户焦点等操作。
- 特点:当一个 Activity 位于前台时,它始终处于
onResume()状态。
- 调用时机:在
第二组:后台与隐藏
当用户离开当前 Activity,比如按下 Home 键、打开一个新的 Activity、或者切换到另一个 App 时,系统会调用以下方法:
-
onPause()
(图片来源网络,侵删)- 调用时机:当系统准备启动或恢复另一个 Activity 时调用。这是生命周期中最重要的一个回调。
- 主要作用:
- 快速、轻量级地保存关键数据,因为
onPause()必须在下一个 Activity 显示之前返回,所以不能执行耗时操作(如网络请求、大文件读写)。 - 停止动画或暂停视频/音乐播放,因为当前 Activity 即将不再对用户可见。
- 释放 Camera 等系统资源,以免被新 Activity 使用时发生冲突。
- 快速、轻量级地保存关键数据,因为
- 示例:
@Override protected void onPause() { super.onPause(); // 暂停视频播放 videoView.pause(); // 释放相机资源 if (camera != null) { camera.release(); } }
-
onStop()- 调用时机:当 Activity 完全不可见时调用(一个新的 Activity 完全覆盖了它,或者用户按了 Home 键)。
- 主要作用:
- 停止所有消耗 CPU 的操作,比如停止动画、停止后台线程、注销在
onStart()中注册的广播接收器等,以节省电量。 - Activity 实例仍然存在于内存中,系统可以将其快速恢复。
- 停止所有消耗 CPU 的操作,比如停止动画、停止后台线程、注销在
- 与
onPause()的区别:onPause()是 Activity 即将失去焦点时的回调,而onStop()是 Activity 完全从屏幕上消失时的回调。
第三组:销毁与销毁前
当 Activity 不再需要时,系统会调用以下方法来销毁它:
onDestroy()- 调用时机:在 Activity 被销毁前调用,这是生命周期中的最后一个回调。
- 主要作用:释放所有资源,在
onCreate()中创建的线程、打开的数据库连接、注册的全局监听器等,都应该在这里进行清理和释放,防止内存泄漏。 - 示例:
@Override protected void onDestroy() { super.onDestroy(); // 停止并移除所有后台任务 myExecutor.shutdown(); // 注销全局监听器 unregisterReceiver(myReceiver); }
可选方法:恢复状态
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 中,旋转屏幕(横竖屏切换)
这是最常见的需要处理状态保存的场景。
-
销毁阶段:
- 系统首先调用
onPause()和onStop()。 - 然后调用
onSaveInstanceState(outState),在这里你可以保存 UI 状态(EditText的内容)。 - 最后调用
onDestroy(),Activity A 被销毁。
- 系统首先调用
-
重建阶段:
- 系统重新创建 Activity A 的实例。
- 调用
onCreate(savedInstanceState),savedInstanceState中包含了之前保存的数据。 - 调用
onRestoreInstanceState(savedInstanceState),在这里你可以恢复 UI 状态。 - 调用
onStart()和onResume()。
最佳实践与注意事项
- 永远不要在
onPause()中执行耗时操作:这会直接拖慢 UI 线程,导致界面卡顿,甚至可能被系统 ANR (Application Not Responding)。 - 在
onStop()中停止耗电操作:这是释放资源、节省电力的最佳时机。 - 在
onDestroy()中彻底清理资源:防止内存泄漏,特别是对于单例、静态变量持有的 Context 或 View。 - 合理使用
onSaveInstanceState():它主要用于保存临时 UI 状态,而不是持久化数据(比如用户填写表单后点击“保存”按钮,应该用数据库或网络 API,而不是onSaveInstanceState),因为它不是 100% 可靠的,在某些极端情况下(如内存不足时)可能不会被调用。 super调用:在重写生命周期方法时,第一行代码必须是super.onCreate(savedInstanceState)等,这确保了父类(通常是Activity或AppCompatActivity)能完成其内部的初始化工作。
| 方法 | 主要作用 | 是否可被杀死 | 何时使用 |
|---|---|---|---|
onCreate() |
初始化,加载布局 | 否 | Activity 创建时,一次性工作 |
onStart() |
Activity 变为可见 | 否 | 准备显示,开始注册轻量级监听 |
onResume() |
Activity 位于前台,可交互 | 否 | 启动动画、相机、音乐等 |
onPause() |
即将失去焦点 | 是 | 快速保存数据、暂停动画、释放资源 |
onStop() |
Activity 完全不可见 | 是 | 停止耗电操作、注销监听器 |
onDestroy() |
Activity 即将被销毁 | 否 | 释放所有资源,防止内存泄漏 |
onSaveInstanceState() |
保存临时 UI 状态 | 否 | 在 onStop() 前,用于屏幕旋转等恢复 |
onRestoreInstanceState() |
恢复临时 UI 状态 | 否 | 在 onCreate() 后,用于恢复 UI |
掌握 Activity 生命周期是成为一名合格 Android 开发者的必经之路,多画图、多实践、多调试,很快你就能熟练运用它了。
