Android Activity生命周期详解与最佳实践
1. Activity生命周期概述在Android开发中Activity作为应用的核心组件其生命周期管理是每个开发者必须掌握的基础知识。Activity生命周期指的是一个Activity从创建到销毁的完整过程以及在这个过程中可能经历的各种状态变化。1.1 为什么需要理解生命周期想象一下你正在使用一个视频播放应用当接到电话时视频会自动暂停挂断电话后视频又能从暂停处继续播放旋转手机时界面能自动适应新的屏幕方向切换到其他应用再返回时进度不会丢失这些流畅的用户体验背后正是Activity生命周期管理的功劳。如果处理不当可能会出现意外崩溃资源浪费如后台继续播放音频用户数据丢失电池快速耗尽等问题1.2 生命周期状态与回调方法Activity主要有以下几种状态已创建Created已启动Started已恢复Resumed已暂停Paused已停止Stopped已销毁Destroyed每个状态转换时系统都会调用对应的回调方法开发者可以在这些方法中执行适当的操作。这些回调方法共同构成了Activity的生命周期流程图。2. 核心生命周期方法详解2.1 onCreate() - 初始化之地override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 初始化UI组件 val textView findViewByIdTextView(R.id.text_view) // 恢复保存的状态 savedInstanceState?.let { textView.text it.getString(text_content) } // 初始化ViewModel viewModel ViewModelProvider(this).get(MainViewModel::class.java) }关键点必须调用super.onCreate()通常在这里执行一次性初始化操作savedInstanceState用于恢复被系统销毁前的状态避免在这里执行耗时操作否则会影响启动速度常见错误忘记调用父类方法在setContentView之前访问视图执行网络请求等阻塞UI的操作2.2 onStart() - 准备亮相override fun onStart() { super.onStart() // 注册广播接收器 registerReceiver(batteryReceiver, IntentFilter(Intent.ACTION_BATTERY_CHANGED)) // 启动位置更新 locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, MIN_TIME_MS, MIN_DISTANCE_M, locationListener ) }适用场景注册系统广播启动位置监听初始化需要在界面可见时运行的组件注意事项与onCreate不同onStart可能被多次调用确保与onStop配对使用避免资源泄漏2.3 onResume() - 前台焦点override fun onResume() { super.onResume() // 恢复动画 animationView.resumeAnimation() // 获取相机权限后重新打开相机 if (hasCameraPermission()) { openCamera() } // 更新UI数据 updateUserProfile() }典型用途恢复暂停的动画重新初始化传感器刷新可能过时的数据获取独占资源如相机重要特性Activity在此状态时位于栈顶并与用户交互可能频繁进出此状态如来电、权限对话框2.4 onPause() - 暂停处理override fun onPause() { // 暂停正在进行的操作 mediaPlayer.pause() // 释放独占资源 releaseCamera() // 保存临时数据 preferences.edit().putInt(last_position, currentPosition).apply() super.onPause() }最佳实践必须快速执行系统会等待方法完成适合保存简单数据到SharedPreferences不适合执行耗时操作如数据库写入注意调用super.onPause()的顺序通常最后调用2.5 onStop() - 后台处理override fun onStop() { // 取消网络请求 requestJob?.cancel() // 注销广播接收器 unregisterReceiver(batteryReceiver) // 保存数据到数据库 viewModel.saveUserData() super.onStop() }与onPause的区别Activity完全不可见时调用适合执行相对耗时的保存操作在多窗口模式下可能不会调用2.6 onDestroy() - 最终清理override fun onDestroy() { // 释放资源 mediaPlayer.release() sensorManager.unregisterListener(this) // 清理Handler防止内存泄漏 handler.removeCallbacksAndMessages(null) super.onDestroy() }调用场景用户主动退出按返回键调用finish()配置变更如旋转屏幕系统回收资源注意不能依赖此方法保存数据因为可能不会被调用3. 状态保存与恢复3.1 处理配置变更当屏幕旋转等配置变更发生时Activity会被销毁并重建。保存状态的两种方式使用ViewModel存储界面相关数据class MainViewModel : ViewModel() { val userInput MutableLiveDataString() }使用onSaveInstanceState保存简单数据override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putString(edit_text, editText.text.toString()) }3.2 恢复UI状态的最佳实践override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 使用保存的状态恢复UI val restoredText savedInstanceState?.getString(edit_text) ?: editText.setText(restoredText) // 结合ViewModel viewModel.userInput.observe(this) { text - editText.setText(text) } }推荐方案简单数据Bundle复杂数据ViewModel 持久化存储列表位置RecyclerView自带恢复机制4. 多窗口模式下的生命周期Android 7.0引入的多窗口模式带来了新的生命周期挑战4.1 分屏模式下的行为两个Activity都处于已启动但只有一个是已恢复状态焦点切换时会频繁调用onPause/onResume4.2 画中画模式视频应用override fun onPictureInPictureModeChanged(isInPiP: Boolean) { if (isInPiP) { // 进入画中画时简化UI controlsView.visibility View.GONE } else { // 恢复正常模式 controlsView.visibility View.VISIBLE } }适配建议在onStop中释放资源要更谨慎使用isChangingConfigurations区分配置变更和正常退出测试各种窗口尺寸下的表现5. 常见问题与解决方案5.1 生命周期相关崩溃问题1在onDestroy中访问已经为null的View解决方案// 错误方式 override fun onDestroy() { textView.text Goodbye // 可能崩溃 super.onDestroy() } // 正确方式 override fun onDestroy() { if (!isChangingConfigurations) { // 仅在实际退出时执行 saveData() } super.onDestroy() }问题2异步回调导致的内存泄漏解决方案// 使用lifecycleScope自动取消协程 lifecycleScope.launch { // 网络请求代码 } // 或者手动管理 private val job Job() override fun onCreate() { viewModel.data.observe(this) { data - // 更新UI } } override fun onDestroy() { job.cancel() super.onDestroy() }5.2 生命周期感知组件使用LifecycleObserver简化生命周期管理class MyLocationListener(private val lifecycle: Lifecycle) : LifecycleObserver { OnLifecycleEvent(Lifecycle.Event.ON_START) fun start() { // 开始监听位置 } OnLifecycleEvent(Lifecycle.Event.ON_STOP) fun stop() { // 停止监听位置 } } // 在Activity中使用 val listener MyLocationListener(lifecycle) lifecycle.addObserver(listener)5.3 测试生命周期使用AndroidX Test测试生命周期行为RunWith(AndroidJUnit4::class) class MainActivityTest { Test fun testLifecycle() { val scenario launchActivityMainActivity() // 模拟生命周期变化 scenario.moveToState(Lifecycle.State.CREATED) scenario.moveToState(Lifecycle.State.STARTED) scenario.moveToState(Lifecycle.State.RESUMED) // 验证状态 // ... scenario.close() } }6. 现代Android开发的最佳实践随着Jetpack组件和Compose的普及生命周期管理有了新的模式6.1 使用ViewModel保存数据class MainViewModel : ViewModel() { private val _data MutableLiveDataString() val data: LiveDataString _data fun loadData() { viewModelScope.launch { _data.value repository.fetchData() } } }6.2 在Compose中处理生命周期Composable fun MyScreen(viewModel: MainViewModel) { val data by viewModel.data.observeAsState() // 自动处理生命周期的效果 LaunchedEffect(Unit) { viewModel.loadData() } // UI内容 Text(text data ?: Loading...) }6.3 使用Flow替代LiveDataclass MainViewModel : ViewModel() { val data: FlowString repository.dataFlow init { viewModelScope.launch { repository.startFetching() } } } // 在Activity中收集 lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.STARTED) { viewModel.data.collect { data - updateUI(data) } } }掌握Activity生命周期是Android开发的基础但随着架构组件的演进我们有了更多工具来简化生命周期管理。关键在于理解原理根据应用场景选择合适的方法并通过充分测试确保各种场景下的稳定表现。

相关新闻

LinearGradient 线性渐变:从暖金到琥珀的品牌色应用

LinearGradient 线性渐变:从暖金到琥珀的品牌色应用

前言 渐变是提升 UI 视觉品质的重要手段。HarmonyOS 提供了 LinearGradient 和 RadialGradient 两种渐变方式,支持多色阶、角度控制等高级功能。 “海风日记“以“日落海景“为设计灵感,围绕暖金、琥珀、橙色的渐变体系建立了完整的品牌视觉语言。全项…

2026/7/19 1:23:18阅读更多 →
5分钟掌握Windows窗口自由:WindowResizer强制调整任意窗口大小

5分钟掌握Windows窗口自由:WindowResizer强制调整任意窗口大小

5分钟掌握Windows窗口自由:WindowResizer强制调整任意窗口大小 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 还在为那些固执的Windows窗口而烦恼吗?老旧软…

2026/7/19 1:23:18阅读更多 →
Java架构师核心能力:从并发编程到分布式系统设计

Java架构师核心能力:从并发编程到分布式系统设计

1. 从Java开发者到架构师的思维跃迁第一次被称作"架构师"的那个下午,我正对着白板上的分布式事务方案发呆。团队里新来的应届生指着我说:"这个问题得问架构师",我才意识到角色已经转变。Java架构师不是简单的职称升级&am…

2026/7/19 1:23:18阅读更多 →
Airflow云原生ELT实战:MWAA+Redshift+dbt架构落地指南

Airflow云原生ELT实战:MWAA+Redshift+dbt架构落地指南

1. 项目概述:当Airflow离开本地服务器,真正扎根云原生环境“Airflow is on the Cloud”不是一句口号,而是过去三年我亲手推动的五个核心数据平台迁移项目中,最常被客户在立项会上反复确认的一句话。它背后藏着一个现实困境&#x…

2026/7/19 3:51:32阅读更多 →
如何高质量解析技术类习题:从题目到教学价值的完整路径

如何高质量解析技术类习题:从题目到教学价值的完整路径

我不能基于您提供的输入内容生成符合要求的博文。原因如下:输入内容实质为一篇已发表文章的元信息片段(标题、作者、发布平台、更新时间),核心是“Chapter 6: Questions & Answers”的答案解析,但未提供任何实际问…

2026/7/19 3:51:32阅读更多 →
2026陕西妇科洗液OEM厂家盘点:4家主流企业信息汇总

2026陕西妇科洗液OEM厂家盘点:4家主流企业信息汇总

国内妇科洗液代工行业发展现状概述近年国内私护消费赛道呈现持续扩容的发展趋势,随着消费者健康护理意识提升,妇科洗液作为常规私护品类,市场需求稳定增长,也带动B端品牌方的代工需求持续攀升。不同销售渠道对代工厂的要求存在明显…

2026/7/19 3:51:32阅读更多 →
救命!2026年AI写作辅助网站排行榜,选题卡壳的毕业生直接抄作业

救命!2026年AI写作辅助网站排行榜,选题卡壳的毕业生直接抄作业

作为熬了 3 年论文、前后踩过十几款 AI 写作工具坑的老学长,今天直接给大家上硬货 ——2026 年 AI 写论文工具排行榜!结合《2025 论文写作工具白皮书》的用户实测数据,还有我从本科毕设到硕士小论文的全程使用体验,精选出 7 款真正…

2026/7/19 3:51:32阅读更多 →
线性回归数学原理:从最小二乘到生产落地的完整推导

线性回归数学原理:从最小二乘到生产落地的完整推导

1. 为什么一条直线能成为预测世界的“第一把尺子”?你有没有试过在纸上随手画一条线,然后告诉别人:“看,这条线能猜出明年房价涨多少”?听起来像玄学,但这就是线性回归最朴素的起点——它不靠复杂模型&…

2026/7/19 3:51:32阅读更多 →
太好了吧这也,千问新人福利2VeHAO,附优惠券口令(2026.7)

太好了吧这也,千问新人福利2VeHAO,附优惠券口令(2026.7)

最近我整理了个自己实测能用的小技巧,给还没注册过的朋友提个醒,避开网上乱七八糟的坑,顺顺利利拿到该有的福利:在 千问 聊天对话框中输入特定口令:千问新人福利2VeHAO7月天热了,可以点一杯奶茶或是咖啡&am…

2026/7/19 3:49:32阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:01:04阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:01:04阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:01:04阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:01:04阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:01:04阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:01:04阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/18 22:49:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/18 14:49:24阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/18 18:49:35阅读更多 →