
本文详解在屏幕旋转等配置变更导致 Activity 重建时,使用 onSaveInstanceState() 和 onRestoreInstanceState() 安全持久化 int[] 数组的完整方案,并强调 onCreate() 中的兜底恢复逻辑。
本文详解在屏幕旋转等配置变更导致 activity 重建时,使用 onsaveinstancestate() 和 onrestoreinstancestate() 安全持久化 int[] 数组的完整方案,并强调 oncreate() 中的兜底恢复逻辑。
在 Android 开发中,当设备发生屏幕旋转、键盘弹出或语言切换等配置变更时,系统默认会销毁并重建当前 Activity。此时,所有局部变量(如你的井字棋游戏状态数组 int[] gameState = {2, 2, 2, 2, 2, 2, 2, 2, 2})将丢失,除非你主动将其保存到系统管理的临时状态容器中——即 Bundle。
Android 提供了标准生命周期回调来支持这一需求:
-
onSaveInstanceState(Bundle outState):在 Activity 被销毁前调用,用于将轻量级数据(如基本类型、数组、Parcelable 对象)写入 Bundle; -
onRestoreInstanceState(Bundle savedInstanceState):在 Activity 重建后、onStart()之前调用,用于从 Bundle 恢复数据; -
但关键注意:
onRestoreInstanceState()并非总是被调用(例如进程被杀后冷启动时不会触发),因此最可靠的做法是在onCreate(Bundle)中进行首次恢复判断。
✅ 正确实现方式如下:
远程控制 Android 设备,支持截图、自动化操作手机 App 等功能。本应用使用 uiautomator2 作为底层框架,通过 ADB 连接设备,用户无需 Root(1)查看手机屏幕;(2)自动化操作手机 App;(3)远程安装/卸载应用……
public class MainActivity extends AppCompatActivity {
private int[] gameState = {2, 2, 2, 2, 2, 2, 2, 2, 2};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// ✅ 兜底恢复:无论 onRestoreInstanceState 是否执行,此处都尝试恢复
if (savedInstanceState != null) {
gameState = savedInstanceState.getIntArray("gameState");
// 可选:验证数组是否为空,避免 NullPointerException
if (gameState == null) {
gameState = new int[]{2, 2, 2, 2, 2, 2, 2, 2, 2};
}
}
}
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
// ✅ 直接保存 int[],无需额外序列化
outState.putIntArray("gameState", gameState);
}
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// ✅ 补充恢复(可选,增强可读性;但非必须,因 onCreate 已覆盖)
int[] restored = savedInstanceState.getIntArray("gameState");
if (restored != null) {
gameState = restored;
}
}
}
? 重要注意事项:
-
putIntArray()和getIntArray()是 Bundle 原生支持的方法,无需第三方库或手动序列化,效率高且安全; - 不要依赖
onDestroy()或修改AndroidManifest.xml的android:configChanges来规避重建——这违背 Android 最佳实践,且易引发 UI 状态不一致; -
SharedPreferences适用于长期存储(如用户偏好),但不适合仅应对旋转等瞬态配置变更,因其涉及磁盘 I/O,性能低且无必要; - 若数组较大(如 >10KB),需考虑
ViewModel+SavedStateHandle方案(更现代、生命周期感知更强),但对井字棋这类小数组,Bundle完全足够。
综上,只需三步即可稳健保存 int[]:① 在 onCreate() 中检查 savedInstanceState 并恢复;② 在 onSaveInstanceState() 中调用 putIntArray();③ (可选)在 onRestoreInstanceState() 中补充恢复逻辑。简洁、高效、符合 Android 架构规范。










