[Android 从零到一] Activity 生命周期与启动模式

1. 背景

Activity 是 Android 四大组件之首,是用户交互的入口。理解它的生命周期和启动模式,是写好 Android 应用的基础。新手常遇到「退出应用数据丢了」「屏幕旋转崩溃」「启动多个相同页面」等问题,追根溯源都是对这块理解不到位。

2. Activity 生命周期

2.1 六种核心回调

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        // 初始化:布局、变量、ViewModel
    }

    override fun onStart() {
        super.onStart()
        // 界面可见,但还不可交互
    }

    override fun onResume() {
        super.onResume()
        // 获得焦点,可交互
    }

    override fun onPause() {
        super.onPause()
        // 失去焦点,不能做耗时操作(应尽快返回)
    }

    override fun onStop() {
        super.onStop()
        // 完全不可见,释放资源
    }

    override fun onRestart() {
        super.onRestart()
        // 从 Stop 回到 Start 前调用
    }

    override fun onDestroy() {
        super.onDestroy()
        // 销毁,清理
    }
}

2.2 生命周期流程

完整的生命周期调用顺序:

用户打开 → onCreate → onStart → onResume → [运行中]
                                      ↓
                               [其他Activity覆盖]
                                      ↓
                                onPause → onStop → onRestart → onStart → onResume
                                      ↓         ↓
                                  onDestroy   [完全不可见]

2.3 常见场景

场景回调序列
首次打开onCreate → onStart → onResume
按返回键退出onPause → onStop → onDestroy
屏幕旋转onPause → onStop → onDestroy → onCreate → onStart → onResume
跳转新 ActivityonPause → onStop

2.4 状态保存与恢复

// 保存临时状态
override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.putString("input_text", binding.etInput.text.toString())
}

// 恢复状态
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
    super.onRestoreInstanceState(savedInstanceState)
    binding.etInput.setText(savedInstanceState.getString("input_text", ""))
}

3. Activity 启动模式

通过 AndroidManifest.xml 的 launchMode 设置:

模式行为典型场景
standard每次启动创建新实例普通页面
singleTop栈顶复用,不走 onCreate消息通知页
singleTask栈中复用,上浮清栈主页
singleInstance独占任务栈来电页
// 验证启动模式:打印 hashCode 看是否复用
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    Log.d("ActivityDemo", "onCreate: ${hashCode()}")
}

override fun onNewIntent(intent: Intent) {
    super.onNewIntent(intent)
    Log.d("ActivityDemo", "onNewIntent 复用: ${hashCode()}")
}

4. 避坑指南

  • 屏幕旋转崩溃:onSaveInstanceState 保存数据,或用 ViewModel 替代
  • 全局变量泄漏:不要在 Activity 中持有静态变量引用自身
  • singleTask + startActivityForResult:不兼容,用 Activity Result API 替代
  • 后台启动限制:Android 10+ 严格限制,用 Notification 代替

5. 总结

  1. onCreate/onDestroy 配对、onStart/onStop 配对、onResume/onPause 配对
  2. 配置变更导致重建,用 ViewModel + onSaveInstanceState 保存数据
  3. 启动模式选错会导致返回栈混乱,按场景选
posted @ 2026-06-09 11:17  天总会晴的  阅读(4)  评论(0)    收藏  举报