
本文介绍如何通过 onSaveInstanceState() 在 Activity 重建(如屏幕旋转)时准确保存并恢复 3×3 棁棋按钮的文本状态(X/O),避免数据丢失,无需依赖 SharedPreferences 或 ViewModel,简洁高效。
本文介绍如何通过 onsaveinstancestate() 在 activity 重建(如屏幕旋转)时准确保存并恢复 3×3 棋盘按钮的文本状态(x/o),避免数据丢失,无需依赖 sharedpreferences 或 viewmodel,简洁高效。
在 Android 开发中,Activity 因配置变更(如屏幕旋转)被销毁并重建时,视图状态默认不会自动保留——尤其是动态设置的 Button 文本(如 "X" 或 "O")。虽然 savedPreferences(即 SharedPreferences)可用于长期存储,但屏幕旋转属于瞬态生命周期事件,应优先使用 onSaveInstanceState():它专为临时状态保存设计,性能高、语义清晰,且与系统生命周期深度集成。
✅ 正确做法:用 Bundle 保存按钮状态
核心思路是将 9 个按钮的当前文本统一序列化为轻量字符串(如 "X,-,O,X,O,-,-,X,O"),其中 - 表示空按钮。相比逐个保存 9 个键值对,单字符串更简洁、可读性强,且易于解析。
1. 保存状态(onSaveInstanceState)
onCreate
-
不要用
SharedPreferences处理旋转场景:它面向跨进程/跨启动的持久化,写入磁盘有开销,且易引发竞态问题;Bundle是内存级、零延迟的首选。 -
避免在
onClick中直接操作Bundle:状态保存必须在onSaveInstanceState()中统一完成,而非每次点击都存——这既低效又违反生命周期契约。 -
健壮性增强:解析字符串时添加边界检查(如
states.length校验)、空值判断,防止ArrayIndexOutOfBoundsException。 -
扩展建议:若需支持更复杂状态(如当前玩家、游戏胜负),可将多个字段打包为 JSON 字符串(如
{"board":["X","-","O",...],"player":"X"}),仍用同一Bundle键管理。
通过以上方案,你能在不改变现有业务逻辑的前提下,以最小侵入性实现旋转无忧的棋盘状态保持——简洁、可靠、符合 Android 官方推荐实践。










