Android Activity数据保存与横竖屏切换处理
1. Activity数据保存机制解析在Android开发中Activity作为最基本的UI组件其生命周期管理是每个开发者必须掌握的核心技能。当设备配置发生改变如横竖屏切换时系统默认会销毁并重建Activity实例这就涉及到关键数据如何保存和恢复的问题。1.1 数据保存的核心方法onSaveInstanceState()是Activity提供的用于临时保存数据的回调方法。这个方法会在Activity可能被系统销毁前调用比如配置变更或内存回收让我们有机会保存当前界面的状态数据。Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString(key_username, mUsername); outState.putInt(key_progress, mProgress); }这里有几个关键点需要注意只能保存简单数据类型和可序列化对象数据大小限制在50KB以内不适合保存大对象如Bitmap保存的数据会在Activity重建后通过onRestoreInstanceState()或onCreate()的Bundle参数恢复1.2 数据恢复的两种方式数据恢复可以通过两种方式实现第一种是在onCreate()中恢复Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (savedInstanceState ! null) { mUsername savedInstanceState.getString(key_username); mProgress savedInstanceState.getInt(key_progress); } }第二种是在onRestoreInstanceState()中恢复Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); mUsername savedInstanceState.getString(key_username); mProgress savedInstanceState.getInt(key_progress); }这两种方式的区别在于onCreate()中的恢复发生在界面初始化之前onRestoreInstanceState()中的恢复发生在界面初始化之后推荐将UI相关的恢复放在onRestoreInstanceState()中2. 横竖屏切换的完整处理方案2.1 默认处理机制当设备方向改变时Android系统默认会销毁当前Activity重新创建Activity实例应用新的资源配置如layout-land中的布局这个过程中会触发完整的生命周期onPause - onSaveInstanceState - onStop - onDestroy - onCreate - onStart - onRestoreInstanceState - onResume2.2 阻止Activity重建如果希望保持Activity实例不被销毁可以在AndroidManifest.xml中配置activity android:name.MainActivity android:configChangesorientation|screenSize|keyboardHidden /activity这样配置后方向改变时只会调用onConfigurationChanged()Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (newConfig.orientation Configuration.ORIENTATION_LANDSCAPE) { // 横屏布局处理 setContentView(R.layout.activity_land); } else { // 竖屏布局处理 setContentView(R.layout.activity_port); } }重要提示从Android 3.2(API 13)开始必须同时声明orientation和screenSize否则在较高版本设备上仍会导致Activity重建。2.3 布局资源的自动切换系统提供了根据方向自动加载不同布局的机制创建res/layout-port/目录存放竖屏布局创建res/layout-land/目录存放横屏布局保持两个目录下的布局文件名相同当方向改变时系统会自动加载对应方向的布局文件。这种方式需要配合Activity重建使用如果阻止了重建则需要手动在onConfigurationChanged()中处理布局切换。3. 实际开发中的最佳实践3.1 ViewModel的数据持久化对于复杂数据推荐使用ViewModel来保存public class UserViewModel extends ViewModel { private MutableLiveDataString username new MutableLiveData(); public void setUsername(String name) { username.setValue(name); } public LiveDataString getUsername() { return username; } } // 在Activity中使用 UserViewModel model new ViewModelProvider(this).get(UserViewModel.class); model.getUsername().observe(this, name - { // 更新UI });ViewModel的优势不受配置变更影响生命周期与Activity分离适合保存中等规模数据3.2 处理Fragment的状态保存Fragment的状态保存需要特别注意public class MyFragment extends Fragment { private String mData; Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString(key_data, mData); } Override public void onViewStateRestored(Nullable Bundle savedInstanceState) { super.onViewStateRestored(savedInstanceState); if (savedInstanceState ! null) { mData savedInstanceState.getString(key_data); } } }Fragment重建时的关键点会创建新的Fragment实例需要重新绑定到Activity视图需要重新创建可以通过setRetainInstance(true)保留非视图相关的数据但不推荐在大多数情况下使用3.3 处理异步任务方向改变时正在执行的异步任务需要妥善处理public class MainActivity extends AppCompatActivity { private AsyncTask mTask; Override protected void onDestroy() { super.onDestroy(); if (isChangingConfigurations()) { // 如果是配置变更导致的销毁不取消任务 } else { // 正常销毁取消任务 if (mTask ! null) { mTask.cancel(true); } } } }更好的做法是使用架构组件如LiveData或RxJava配合ViewModel来管理异步任务。4. 常见问题与解决方案4.1 数据恢复失败排查当发现保存的数据没有正确恢复时可以检查确保所有要保存的数据都实现了Parcelable或Serializable接口检查Bundle的key是否一致验证数据是否确实被保存可以在onSaveInstanceState中打印日志确认没有在onRestoreInstanceState中调用super之前访问数据4.2 横竖屏布局切换无效如果布局没有按预期切换检查layout-land和layout-port目录是否存在且命名正确确认两个目录下的布局文件名相同如果阻止了Activity重建需要手动处理布局切换检查主题中是否固定了屏幕方向4.3 WebView状态保存WebView的状态保存需要特殊处理Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); mWebView.saveState(outState); } Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); mWebView.restoreState(savedInstanceState); }4.4 大尺寸数据保存策略对于不适合保存在Bundle中的大数据使用临时文件存储考虑使用Room数据库实现自定义的缓存机制评估是否真的需要在配置变更时保留这些数据5. 性能优化建议5.1 减少保存的数据量只保存真正需要恢复的数据用户输入的表单内容滚动位置选择状态临时生成的UI状态5.2 延迟加载策略对于复杂的数据恢复先恢复关键数据保证UI可用在onResume()后异步加载其他数据显示加载进度提示5.3 方向锁定的合理使用在某些场景下可以考虑固定方向activity android:name.VideoPlayerActivity android:screenOrientationlandscape /activity但要注意只在确实需要的Activity上锁定提供手动切换方向的按钮考虑不同设备的差异5.4 测试策略完善的测试方案应包括快速多次旋转设备测试数据一致性在低内存设备上测试测试从后台恢复时的表现测试与其他生命周期事件的交互在实际项目中我通常会建立一个BaseActivity来处理这些公共逻辑让所有Activity继承它。这样可以确保一致的行为也便于维护。特别是在处理WebView、视频播放等复杂场景时统一的基础实现可以避免很多坑。

相关新闻

嵌入式SPI通信进阶:McSPI多通道架构、配置与实战调试指南

嵌入式SPI通信进阶:McSPI多通道架构、配置与实战调试指南

1. 项目概述与McSPI核心价值在嵌入式系统开发中,与外设通信是家常便饭。无论是读取传感器数据、驱动显示屏,还是与存储芯片交互,一个高效、可靠的通信接口至关重要。SPI(Serial Peripheral Interface)以其简单、高速、…

2026/10/17 19:29:52 阅读更多 →
ARM Cortex-A嵌入式开发:McSPI DMA与电源管理实战配置指南

ARM Cortex-A嵌入式开发:McSPI DMA与电源管理实战配置指南

1. 项目概述与核心价值在嵌入式开发,尤其是基于ARM Cortex-A系列处理器的复杂应用中,SPI总线的效率与系统功耗是两个永恒的核心议题。我们经常遇到这样的场景:一个传感器需要以1MHz的速率持续上传数据,如果采用传统的中断方式&…

2026/10/17 19:29:52 阅读更多 →
AT89S52单片机驱动LED点阵屏设计与实现

AT89S52单片机驱动LED点阵屏设计与实现

1. 项目概述:AT89S52单片机驱动LED点阵屏的设计初衷 第一次接触单片机LED点阵显示是在大三的电子设计课上,当时看到学长用几块小小的芯片就能控制整面墙的LED显示文字,那种震撼感至今难忘。这个基于AT89S52的LED点阵显示项目,正是…

2026/10/17 21:02:03 阅读更多 →

最新新闻

【信道估计】毫米波MIMO系统LS、OMP和SBL UPA远场信道估计(NMSE性能评估)【含Matlab源码 16091期】

【信道估计】毫米波MIMO系统LS、OMP和SBL UPA远场信道估计(NMSE性能评估)【含Matlab源码 16091期】

💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab武动乾坤博客之家💞…

2026/10/18 21:33:03 阅读更多 →
Qwen3-TTS零样本音色克隆实战:从3秒参考音频到批量语音合成

Qwen3-TTS零样本音色克隆实战:从3秒参考音频到批量语音合成

简介:这份资源是面向语音合成初学者与开发者的Qwen3-TTS实战教程配套代码包,重点解决多语种语音生成中语速、音高、音色难以独立调节的问题。教程覆盖环境准备、快速部署到分步实践,并延伸至视频配音、有声书制作、智能客服等落地场景&#x…

2026/10/18 21:33:03 阅读更多 →
C++游戏开发实战:SDL2引擎下的超级玛丽复刻与实时系统训练

C++游戏开发实战:SDL2引擎下的超级玛丽复刻与实时系统训练

简介:这是一份基于C语言实现的经典横版闯关游戏——超级玛丽的完整源码工程,面向C初学者与面向对象编程实践者,适用于课程设计、游戏开发入门及OOP项目实训。资源包含可直接编译运行的Visual Studio 2008工程(.sln/.vcproj&#x…

2026/10/18 21:32:02 阅读更多 →
DHI MATLAB工具箱:解析DFS0/DFS2/MESH水文模型文件

DHI MATLAB工具箱:解析DFS0/DFS2/MESH水文模型文件

简介:本资源是面向水文水利、海洋工程及环境建模领域科研人员与MATLAB开发者的DHI文件专用处理工具箱,解决MIKE系列软件(如MIKE 21/3、DHI DFS格式)生成的二进制数据在MATLAB中读写、解析与后处理困难的问题。压缩包共108个文件&a…

2026/10/18 21:32:02 阅读更多 →
Phoenix与HBase的关系:SQL-on-HBase架构原理与性能调优实践

Phoenix与HBase的关系:SQL-on-HBase架构原理与性能调优实践

1. 这俩到底啥关系:先扒清楚Phoenix和HBase的定位很多刚接触大数据组件的人第一次看到“Phoenix与HBase的关系”这个问题,第一反应可能是:这俩是不是同一个东西的两个名字?或者一个是一个的升级版?都不对。Phoenix和HB…

2026/10/18 21:32:02 阅读更多 →
UltraEdit 语法高亮文件下载与添加:用 TaoToken 统一管理配置来源

UltraEdit 语法高亮文件下载与添加:用 TaoToken 统一管理配置来源

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 21:32:02 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →