5.5挑战练习
GeoQuiz应用有一些漏洞,从易到难,以下为待解决的三个漏洞:
1.用户作弊后,可以旋转CheatActivity来清除作弊痕迹。
2.作弊返回后,用户可以旋转QuizActivity来消除mIsCheater变量值。
3.用户可以不断单击NEXT按钮,跳到偷看过答案的问题,从而使作弊记录丢失。
首选需要在CheatActivity里重写onSaveInstanceState(Bundle saveInstanceState)方法
@Override
public void onSaveInstanceState(Bundle saveInstanceState){
super.onSaveInstanceState(saveInstanceState);
Log.d(TAGG,"onSaveInstanceState");
saveInstanceState.putBoolean(DO,mWasCheat);
}
在这之前创建记录一个作弊痕迹的静态变量和两个标签常量
public static boolean mWasCheat = false;
private static final String TAGG = "CheatActivity";
private static final String DO = "Cheat?";
之后取出saveInstanceState中的值
if (savedInstanceState != null){
mWasCheat = savedInstanceState.getBoolean(DO,false);
}
为了在作弊之后一直显示答案使用以下判断
if (mWasCheat){
if (mAnswerIsTrue){
mAnswerTextView.setText(R.string.true_button);
}else {
mAnswerTextView.setText(R.string.false_button);
}
}
现在开始修改QuizActivity
首先将之前的mIsCheater删除,并将使用的部分替换为CheatActivity.mWasCheat
修改重写的onSaveInstanceState()中的代码
@Override
public void onSaveInstanceState(Bundle saveInstanceState){
super.onSaveInstanceState(saveInstanceState);
Log.d(TAG,"onSaveInstanceState");
saveInstanceState.putInt(KEY_INDEX,mCurrentIndex);
saveInstanceState.putBoolean(WAS_CHEAT,CheatActivity.mWasCheat);
}
取出如下
if(savedInstanceState != null){
mCurrentIndex = savedInstanceState.getInt(KEY_INDEX,0);
CheatActivity.mWasCheat = saved