You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中如何保存IntArray以处理屏幕旋转?

解决屏幕旋转时保存井字棋int数组状态的方案

核心正确实现方式

你尝试的onSaveInstanceState/onRestoreInstanceState是标准且推荐的方案,问题大概率出在细节处理上,以下是修正后的完整实现:

public class TicTacToeActivity 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_tic_tac_toe);
        
        // 关键:在onCreate中处理状态恢复,覆盖所有重建场景
        if (savedInstanceState != null) {
            gameState = savedInstanceState.getIntArray("gameState");
            // 兜底:防止数组为空,恢复默认值
            if (gameState == null) {
                gameState = new int[]{2, 2, 2, 2, 2, 2, 2, 2, 2};
            }
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        // 将数组存入Bundle
        outState.putIntArray("gameState", gameState);
    }

    // 可选保留:onRestoreInstanceState仅在特定重建场景触发,优先依赖onCreate的处理逻辑
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        gameState = savedInstanceState.getIntArray("gameState");
        if (gameState == null) {
            gameState = new int[]{2, 2, 2, 2, 2, 2, 2, 2, 2};
        }
    }
}

关键注意事项

  • 不要单独依赖onRestoreInstanceState:该方法仅在Activity确被销毁重建时调用,而onCreate中的savedInstanceState判断能覆盖所有重建场景(包括屏幕旋转)。
  • 必须加空值判断:getIntArray找不到对应key时会返回null,兜底恢复默认数组可避免空指针异常。
  • 放弃错误方案:修改onDestroy或清单配置阻止Activity重建属于不良实践,会破坏Android生命周期规范,适配性极差。

备选方案:SharedPreferences持久化(适用于需跨会话保存的场景)

如果除屏幕旋转外,还需要退出APP后保留状态,可通过SharedPreferences逐个保存数组元素:

// 保存数组
SharedPreferences sp = getSharedPreferences("TicTacToePrefs", MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
for (int i = 0; i < gameState.length; i++) {
    editor.putInt("gameState_" + i, gameState[i]);
}
editor.apply();

// 恢复数组
SharedPreferences sp = getSharedPreferences("TicTacToePrefs", MODE_PRIVATE);
int[] restoredState = new int[9];
for (int i = 0; i < restoredState.length; i++) {
    restoredState[i] = sp.getInt("gameState_" + i, 2); // 默认值设为2
}
gameState = restoredState;

可将保存逻辑放在onSaveInstanceState或onPause中,恢复逻辑放在onCreate中。

内容的提问来源于stack exchange,提问作者MysticSticker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 00:04:56