同一Activity多次触发Intent能否保留历史状态?测验类APP方案咨询
测验类APP答题状态存储方案解答
二维数组存储方案的可行性说明
你提到的String[][] States二维数组方案可以实现基础的状态存储需求,但存在以下明显缺陷:
- 类型不安全:所有数值都转为String存储,后续读取需要频繁做类型转换,容易出现格式转换异常,也会增加冗余代码
- 扩展性差:如果后续需要新增存储字段(例如作答时长、是否标记为难题等),二维数组结构无法灵活调整,改造成本很高
- 可读性差:通过下标取值的方式,后续维护代码时很难快速对应不同下标代表的业务含义,容易写错下标导致逻辑bug
如果你的项目非常简单、后续完全没有迭代需求,该方案可以正常跑通,否则不推荐使用。
更推荐的实现方案
单次答题进程内存储(不需要跨重启留存记录)
自定义数据类封装答题状态,搭配List存储是更合理的方案,示例(Java环境):
// 定义答题状态实体类 public class AnswerState { private int questionIndex; // 对应你提到的Activity索引 private int correctIndex; // 正确选项下标 private int myChoice; // 用户选择的下标,未作答可设为-1标记 // 按需添加构造方法、getter、setter即可 }
存储时直接初始化List即可:
List<AnswerState> answerStateList = new ArrayList<>();
该方案读写逻辑清晰,后续新增字段只需要在实体类中添加属性即可,完全兼容旧逻辑。
跨页面传递优化建议
你目前每次跳转同一个Activity加载新题,不需要每次都传递全量题目数组和状态,可选优化点:
- 将全局题目列表、答题状态List存到自定义Application类或者单例管理类中,所有页面都可以直接读写,不需要每次通过Intent传递大量数据
- 给启动Activity的Intent添加
FLAG_ACTIVITY_SINGLE_TOP标记,配合onNewIntent方法接收新的题目加载请求,避免反复创建相同的Activity实例,降低内存消耗
你当前的传参代码可以简化为只传需要加载的题目下标:
intent.putExtra("currentQuestionIndex", 2);
用户返回之前的题目时,直接从状态列表中读取对应下标的myChoice值回填到页面即可。
内容的提问来源于stack exchange,提问作者Takis Pan
相关产品推荐
相关产品推荐

