Skip to content

在 Android 开发中,Activity 的生命周期是理解应用行为的基础。以下是详细的生命周期解析,结合 Kotlin 代码示例和关键场景说明:


1. 生命周期流程图

text
[Activity 启动]

onCreate() → onStart() → onResume() → (Activity 前台运行)
      ↑          ↓               ↓
      └── onRestart() ← onStop() ← onPause()

          onDestroy() → (Activity 销毁)

2. 生命周期方法详解

(1) onCreate()

  • 调用时机:Activity 首次创建时(如应用启动或配置变更后重建)。
  • 核心用途
    • 初始化 UI(调用 setContentView)。
    • 绑定数据(如从 ViewModelIntent 获取数据)。
  • 示例代码
    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() 中恢复

    kotlin
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val savedText = savedInstanceState?.getString("input_text") ?: ""
        editText.setText(savedText)
    }
  • 方式 2:在 onRestoreInstanceState() 中恢复

    kotlin
    override 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. 最佳实践

  1. 避免在 onCreate() 中执行耗时操作:初始化应快速完成,否则会导致界面卡顿。
  2. 资源释放优先级
    • onPause():释放高优先级资源(如摄像头)。
    • onStop():释放低优先级资源(如网络请求)。
  3. 使用 ViewModel + LiveData:分离 UI 逻辑与数据,避免因配置变更丢失数据。
    kotlin
    class MainViewModel : ViewModel() {
        val data = MutableLiveData<String>()
    }
  4. 处理配置变更
    • 若需手动处理屏幕旋转,可在 AndroidManifest.xml 中配置:
      xml
      <activity android:name=".MainActivity"
          android:configChanges="orientation|screenSize|keyboardHidden" />

总结

  • 生命周期本质:系统通过回调方法通知 Activity 状态变化,开发者需合理分配资源操作。
  • 核心原则
    • 快速响应:生命周期方法应轻量化,避免阻塞主线程。
    • 状态持久化:通过 onSaveInstanceStateViewModel 保证数据不丢失。
    • 避免泄漏:在 onDestroy() 中清理资源,但不要依赖它保存关键数据。