无关技术
但凡是要饭的,没有要早饭的!为什么呢?因为能够早起的人,他不至于去要饭.
本章概要
本章主要讲了Activity的创建,Activity间的数据传递,Activity栈.
Activity间的通信
A启动B
把A中的数据传递给B使用Intent,可以使用intent.putExtra 打包基本数据类型的数据,和经过序列化的数据
将B中的数据返回给A
A启动时用startActivityForResult
B中调用setResult,将数据放在Intent中
然后重写A中的onActivityResult
挑战练习
1.用户作弊后,可以旋转CheatActivity来清除作弊痕迹
解决思路:
用一个boolean值来保存,是否点击了cheat按钮,默认为false,点击了就设置为true
在onSaveInstanceState,保存这个boolean值.
然后在实现的过程中,发现如果点击了cheat按钮,在旋转屏幕,在返回时,onActivityForResult方法中,resultCode!=result_ok.
就想在onStop方法中,调用一次setResult方法,结果还是不行.resultCode!=result_ok.
怀疑onStop方法执行靠后于A中的onActivityResult的接收,就又在onPause中,调用setResult方法,结果还是发现resultCode!=result_ok.
然后又监听onBackPressed,调用setResult方法,还是一样.resultCode!=result_ok.
只好在onCreate中,判断Bundle不为空,调用一次setResult方法,结果可行.
代码实现:
声明一个Boolean用于保存用户是否作弊
`
private boolean isCheat;
当用户点击cheat按钮时,将其置为true
mShowAnswerButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showAnswer();
isCheat = true;
setAnswerShownResult(isCheat);
}
});
防止屏幕旋转时,来清除作弊值,重写onSaveInstancestate方法
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(IS_CHEAT, isCheat);
}
`
然后在onCreate方法中把这个值读取出来,并调用setResult方法
`
if (savedInstanceState != null) {
isCheat = savedInstanceState.getBoolean(IS_CHEAT);
setAnswerShownResult(isCheat);
}
private void setAnswerShownResult(boolean isAnserShown) {
Intent data = new Intent();
data.putExtra(ANSER_SHOWN, isAnserShown);
setResult(RESULT_OK, data);
}
`
2.旋转QuizActivity来清除mIsCheater变量值
同1一样,重写onSaveInstanceState方法,然后在onCreate方法中取出这个值.
3.不断点击next按钮,回到下一次做过弊的题,从而使作弊记录丢失
思路:声明一个boolean数组,默认值都为false,当用户作弊之后,就给当前索引所在的boolean值,置为true.当不断点击next按钮回到这道题,用boolean[mCurrentIndex]来判断是否做过弊.
声明一个数组,默认值都是false,就是没有作弊.
`
private boolean[] mIsCheaters = new boolean[mQuestionBank.length];
如果用户作弊了,调用CheatActivity的如下方法
public static boolean wasAnswerShown(Intent result) {
return result.getBooleanExtra(ANSER_SHOWN, false);
}
在QuizActivity 的onActivityResult方法中会得到是否作弊的值,然后给数组赋值
if (requestCode == REQUEST_CODE_CHEAT) {
if (data == null) {
Log.d(TAG, "onActivityResult: " + "intent 为空");
return;
}
// mIsCheater = CheatActivity.wasAnswerShown(data);
// Log.d(TAG, "onActivityResult: " + "是否作弊" + mIsCheater);
** mIsCheaters[mCurrentIndex] = CheatActivity.wasAnswerShown(data);**
}
`
防止通过旋转来清除这些信息所以需要重写
`
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(KEY_INDEX, mCurrentIndex);
outState.putBoolean(KEY_IS_CHEATER, mIsCheater);
outState.putBooleanArray(KEY_CHEATER_ARRAY, mIsCheaters);
}
`
然后在onCreate方法中恢复
`
if (savedInstanceState != null) {
mCurrentIndex = savedInstanceState.getInt(KEY_INDEX, 0);
mIsCheater = savedInstanceState.getBoolean(KEY_IS_CHEATER);
mIsCheaters = savedInstanceState.getBooleanArray(KEY_CHEATER_ARRAY);
}
`