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开发的基础但随着架构组件的演进我们有了更多工具来简化生命周期管理。关键在于理解原理根据应用场景选择合适的方法并通过充分测试确保各种场景下的稳定表现。

相关新闻

OpenClaw:本地化AI助手的革命性架构与应用

OpenClaw:本地化AI助手的革命性架构与应用

1. OpenClaw:重新定义个人AI助手的边界第一次在Telegram里收到OpenClaw自动整理的会议纪要时,我盯着手机屏幕足足愣了三分钟。这个自称"小龙虾"的AI不仅准确识别了Zoom会议录音中的关键决策点,还根据历史对话自动关联了待办事项&am…

2026/7/29 22:46:18 阅读更多 →
响应json数据和文本数据

响应json数据和文本数据

响应页面 响应数据 文本数据 json数据 package com.ycl.controller;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; Controller public class UserController {RequestMapping("/toJumpPage")…

2026/7/27 22:07:20 阅读更多 →
Vue双向绑定原理与实战:从v-model到defineModel

Vue双向绑定原理与实战:从v-model到defineModel

1. 初识Vue双向绑定:从原生表单到组件通信第一次接触Vue的双向绑定是在2016年接手一个后台管理系统重构项目时。当时团队从jQuery转向Vue,最让我震撼的就是v-model这个魔法般的指令——它用一行代码就解决了表单数据和状态的同步问题。但真正深入使用后才…

2026/7/29 6:01:39 阅读更多 →

最新新闻

STM32硬件SPI驱动三线SPI-LCD:协议解析与DMA优化实践

STM32硬件SPI驱动三线SPI-LCD:协议解析与DMA优化实践

1. 从三线SPI-LCD的“非主流”说起如果你玩过STM32驱动LCD,大概率用过8080并口或者标准的4线SPI。前者速度快但占引脚多,后者协议简单但也要4根线(SCK, MOSI, MISO, CS)。但最近在一些追求极致成本或特定封装的小尺寸LCD模块上&am…

2026/7/30 12:17:51 阅读更多 →
基于启发式搜索的最优路径规划算法研究7

基于启发式搜索的最优路径规划算法研究7

引言路径规划问题的背景与重要性启发式搜索在路径规划中的核心作用研究目标与文章结构概述路径规划问题定义路径规划的数学建模(图论与状态空间表示)最优路径的评估标准(如最短距离、最少时间、最低成本)常见应用场景(…

2026/7/30 12:17:51 阅读更多 →
Python在芯片健康评估中的实战应用

Python在芯片健康评估中的实战应用

1. 芯片健康评估:为什么需要Python这把"手术刀"在半导体行业摸爬滚打十几年,我见过太多工程师面对芯片异常时的手足无措。去年有个典型案例:某工业控制器批量出现间歇性死机,厂商更换了所有外围元件仍无法解决&#xff…

2026/7/30 12:17:51 阅读更多 →
隐含参数 _b_tree_bitmap_plans 导致 SQL 执行计划劣化

隐含参数 _b_tree_bitmap_plans 导致 SQL 执行计划劣化

问题现象:同一关键 SQL,一厂平均执行 12ms,三厂平均执行 700ms(三厂数据量更小)根因:三厂数据库设置了隐含参数 _b_tree_bitmap_plansFALSE,禁用了 BITMAP CONVERSION TO ROWIDS 访问路径&#…

2026/7/30 12:17:51 阅读更多 →
NR37-CP双麦DSP芯片:20pin CSP封装与14mA低功耗架构的电路设计权衡

NR37-CP双麦DSP芯片:20pin CSP封装与14mA低功耗架构的电路设计权衡

一、20pin CSP封装的PCB集成挑战 NR37-CP采用20pin 2.62.2mm专有CSP(Chip Scale Package)封装,底部视图,pin间距0.5mm。这一封装尺寸在芯片级属于超小型设计——2.6mm2.2mm的面积仅略大于BGA封装的接触点区域,相比QFP…

2026/7/30 12:17:51 阅读更多 →
现在不学AI驱动微服务开发,6个月后将错过DevOps 3.0人才认证窗口期

现在不学AI驱动微服务开发,6个月后将错过DevOps 3.0人才认证窗口期

更多请点击: https://intelliparadigm.com 第一章:AI驱动微服务开发的时代必然性 在云原生架构持续演进与业务复杂度指数级增长的双重压力下,传统微服务开发模式正面临交付周期长、故障定位难、配置治理碎片化等系统性瓶颈。AI技术不再仅作…

2026/7/30 12:16:51 阅读更多 →

日新闻

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:13 阅读更多 →
如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾经在浏览…

2026/7/30 0:00:13 阅读更多 →
“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

更多请点击: https://intelliparadigm.com 第一章:AI 教师备课辅助 AI 教师备课辅助系统正逐步成为教育数字化转型的核心支撑工具,它并非替代教师,而是通过语义理解、知识图谱与多模态生成能力,将教师从重复性劳动中解…

2026/7/30 0:00:13 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/29 22:18:20 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻