在 Android 开发中,Activity 的生命周期是理解应用行为的基础。以下是详细的生命周期解析,结合 Kotlin 代码示例和关键场景说明:
1. 生命周期流程图
text
[Activity 启动]
↓
onCreate() → onStart() → onResume() → (Activity 前台运行)
↑ ↓ ↓
└── onRestart() ← onStop() ← onPause()
↓
onDestroy() → (Activity 销毁)
2. 生命周期方法详解
(1) onCreate()
- 调用时机:Activity 首次创建时(如应用启动或配置变更后重建)。
- 核心用途:
- 初始化 UI(调用
setContentView
)。 - 绑定数据(如从
ViewModel
或Intent
获取数据)。
- 初始化 UI(调用
- 示例代码:kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 恢复保存的状态(如屏幕旋转后的数据) val savedData = savedInstanceState?.getString("key") }
(2) onStart()
- 调用时机:Activity 可见但未进入前台(例如从后台回到应用,但被其他透明 Activity 覆盖)。
- 核心用途:
- 初始化需要在可见时运行的逻辑(如注册广播接收器)。
- 示例代码:kotlin
override fun onStart() { super.onStart() // 注册广播接收器 registerReceiver(receiver, IntentFilter("CUSTOM_ACTION")) }
(3) onResume()
- 调用时机:Activity 进入前台并可与用户交互。
- 核心用途:
- 启动动画、传感器监听、摄像头预览等需要实时交互的操作。
- 示例代码:kotlin
override fun onResume() { super.onResume() // 恢复动画或摄像头 camera.startPreview() }
(4) onPause()
- 调用时机:Activity 失去焦点但仍部分可见(例如弹出对话框或启动新 Activity)。
- 核心用途:
- 释放占用资源(如关闭摄像头、暂停动画)。
- 保存未提交的临时数据(如表单输入)。
- 示例代码:kotlin
override fun onPause() { super.onPause() // 暂停摄像头预览 camera.stopPreview() }
(5) onStop()
- 调用时机:Activity 完全不可见(例如被其他 Activity 完全覆盖或应用进入后台)。
- 核心用途:
- 释放无需在后台运行的资源(如数据库连接)。
- 注销广播接收器或监听器。
- 示例代码:kotlin
override fun onStop() { super.onStop() // 注销广播接收器 unregisterReceiver(receiver) }
(6) onRestart()
- 调用时机:Activity 从
onStop()
状态重新回到前台前。 - 核心用途:
- 重新初始化在
onStop()
中释放的资源。
- 重新初始化在
- 示例代码:kotlin
override fun onRestart() { super.onRestart() // 重新加载数据(如从网络请求) }
(7) onDestroy()
- 调用时机:Activity 被销毁前(用户主动退出或系统回收资源)。
- 核心用途:
- 清理内存泄漏风险(如静态引用、未取消的协程)。
- 注意:不能依赖此方法保存数据,系统可能直接终止进程而不调用它。
- 示例代码:kotlin
override fun onDestroy() { super.onDestroy() // 取消协程任务 job?.cancel() }
3. 状态保存与恢复
(1) onSaveInstanceState(outState: Bundle)
- 调用时机:Activity 可能被系统销毁前(如配置变更或内存不足)。
- 核心用途:
- 保存临时 UI 状态(如输入框内容、滚动位置)。
- 示例代码:kotlin
override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putString("input_text", editText.text.toString()) }
(2) 恢复状态
方式 1:在
onCreate()
中恢复:kotlinoverride fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val savedText = savedInstanceState?.getString("input_text") ?: "" editText.setText(savedText) }
方式 2:在
onRestoreInstanceState()
中恢复:kotlinoverride fun onRestoreInstanceState(savedInstanceState: Bundle) { super.onRestoreInstanceState(savedInstanceState) val savedText = savedInstanceState.getString("input_text") editText.setText(savedText) }
4. 常见场景与生命周期
场景 1:用户按下返回键
text
onPause() → onStop() → onDestroy()
场景 2:启动新 Activity
text
当前 Activity:onPause() → onStop()
新 Activity:onCreate() → onStart() → onResume()
场景 3:屏幕旋转(配置变更)
text
旧 Activity:onPause() → onStop() → onSaveInstanceState() → onDestroy()
新 Activity:onCreate() → onStart() → onRestoreInstanceState() → onResume()
5. 最佳实践
- 避免在
onCreate()
中执行耗时操作:初始化应快速完成,否则会导致界面卡顿。 - 资源释放优先级:
onPause()
:释放高优先级资源(如摄像头)。onStop()
:释放低优先级资源(如网络请求)。
- 使用
ViewModel
+LiveData
:分离 UI 逻辑与数据,避免因配置变更丢失数据。kotlinclass MainViewModel : ViewModel() { val data = MutableLiveData<String>() }
- 处理配置变更:
- 若需手动处理屏幕旋转,可在
AndroidManifest.xml
中配置:xml<activity android:name=".MainActivity" android:configChanges="orientation|screenSize|keyboardHidden" />
- 若需手动处理屏幕旋转,可在
总结
- 生命周期本质:系统通过回调方法通知 Activity 状态变化,开发者需合理分配资源操作。
- 核心原则:
- 快速响应:生命周期方法应轻量化,避免阻塞主线程。
- 状态持久化:通过
onSaveInstanceState
和ViewModel
保证数据不丢失。 - 避免泄漏:在
onDestroy()
中清理资源,但不要依赖它保存关键数据。