Android权威编程指南第五章挑战练习解答。
挑战练习-堵住漏洞
用户作弊后,可以 旋转 CheatActivity来清除作弊痕迹。
主要思路是,重写一个onSaveInstanceState方法,然后在CheatActivity中调用savedInstanceState,savedInstanceState用于保存Activity被Destory前的数据。
新建一个键值对,用于存放是否查看过答案的信息
private static final String KEY_CHEAT = "cheat";
private boolean cheatFlag = false;
重写onSaveInstanceState方法,注意不能像下图这样写
因为下图中EXTRA_ANSWER_SHOWN的变量保存在data这个Intent对象中,直接在cheatActivity中取是无效的。
所以我们需要在setAnswerShownResult方法中将查看过答案的信息保存在savedInstanceState的KEY_CHEAT中,就像下图这样:
检测是否保存过数据,若保存过直接检测键值对所携带的信息,已经查看过答案,就可以直接调用setAnswerShownResult方法了。
注意不能直接写成已经保存过信息就调用此方法,因为用户可能没点击“查看答案”按钮。
这样点击“查看答案”后,在CheatActivity怎么转都会记录作弊的信息。
作弊返回后,用户可以旋转QuizActivity来清除mIsCheater变量值
有了上一个问题的经验,这个就很简单,思路是一样的,我们需要在Activity关闭前保存信息,并在启动时检测是否已经保存过信息。
在MainStudy.java中添加
private static final String KEY_CHEAT = "cheat";
添加保存信息。
读取信息
这样在MainActivity怎么转,作弊的信息都会被记录了。
用户可以不断点击“下一个”按钮,转到曾经看过答案的问题,导致记录丢失
我们把mIsAnswer换成数组
在Activity被创建时,读取所有问题的作弊信息
保存的位置也要修改
这样无论怎么转,作弊信息都会被保留。