無(wú)關(guān)技術(shù)
但凡是要飯的,沒(méi)有要早飯的!為什么呢?因?yàn)槟軌蛟缙鸬娜?他不至于去要飯.
本章概要
本章主要講了Activity的創(chuàng)建,Activity間的數(shù)據(jù)傳遞,Activity棧.
Activity間的通信
A啟動(dòng)B
把A中的數(shù)據(jù)傳遞給B使用Intent,可以使用intent.putExtra 打包基本數(shù)據(jù)類(lèi)型的數(shù)據(jù),和經(jīng)過(guò)序列化的數(shù)據(jù)
將B中的數(shù)據(jù)返回給A
A啟動(dòng)時(shí)用startActivityForResult
B中調(diào)用setResult,將數(shù)據(jù)放在Intent中
然后重寫(xiě)A中的onActivityResult
挑戰(zhàn)練習(xí)
1.用戶(hù)作弊后,可以旋轉(zhuǎn)CheatActivity來(lái)清除作弊痕跡
解決思路:
用一個(gè)boolean值來(lái)保存,是否點(diǎn)擊了cheat按鈕,默認(rèn)為false,點(diǎn)擊了就設(shè)置為true
在onSaveInstanceState,保存這個(gè)boolean值.
然后在實(shí)現(xiàn)的過(guò)程中,發(fā)現(xiàn)如果點(diǎn)擊了cheat按鈕,在旋轉(zhuǎn)屏幕,在返回時(shí),onActivityForResult方法中,resultCode!=result_ok.
就想在onStop方法中,調(diào)用一次setResult方法,結(jié)果還是不行.resultCode!=result_ok.
懷疑onStop方法執(zhí)行靠后于A中的onActivityResult的接收,就又在onPause中,調(diào)用setResult方法,結(jié)果還是發(fā)現(xiàn)resultCode!=result_ok.
然后又監(jiān)聽(tīng)onBackPressed,調(diào)用setResult方法,還是一樣.resultCode!=result_ok.
只好在onCreate中,判斷Bundle不為空,調(diào)用一次setResult方法,結(jié)果可行.
代碼實(shí)現(xiàn):
聲明一個(gè)Boolean用于保存用戶(hù)是否作弊
`
private boolean isCheat;
當(dāng)用戶(hù)點(diǎn)擊cheat按鈕時(shí),將其置為true
mShowAnswerButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showAnswer();
isCheat = true;
setAnswerShownResult(isCheat);
}
});
防止屏幕旋轉(zhuǎn)時(shí),來(lái)清除作弊值,重寫(xiě)onSaveInstancestate方法
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(IS_CHEAT, isCheat);
}
`
然后在onCreate方法中把這個(gè)值讀取出來(lái),并調(diào)用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.旋轉(zhuǎn)QuizActivity來(lái)清除mIsCheater變量值
同1一樣,重寫(xiě)onSaveInstanceState方法,然后在onCreate方法中取出這個(gè)值.
3.不斷點(diǎn)擊next按鈕,回到下一次做過(guò)弊的題,從而使作弊記錄丟失
思路:聲明一個(gè)boolean數(shù)組,默認(rèn)值都為false,當(dāng)用戶(hù)作弊之后,就給當(dāng)前索引所在的boolean值,置為true.當(dāng)不斷點(diǎn)擊next按鈕回到這道題,用boolean[mCurrentIndex]來(lái)判斷是否做過(guò)弊.
聲明一個(gè)數(shù)組,默認(rèn)值都是false,就是沒(méi)有作弊.
`
private boolean[] mIsCheaters = new boolean[mQuestionBank.length];
如果用戶(hù)作弊了,調(diào)用CheatActivity的如下方法
public static boolean wasAnswerShown(Intent result) {
return result.getBooleanExtra(ANSER_SHOWN, false);
}
在QuizActivity 的onActivityResult方法中會(huì)得到是否作弊的值,然后給數(shù)組賦值
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);**
}
`
防止通過(guò)旋轉(zhuǎn)來(lái)清除這些信息所以需要重寫(xiě)
`
@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方法中恢復(fù)
`
if (savedInstanceState != null) {
mCurrentIndex = savedInstanceState.getInt(KEY_INDEX, 0);
mIsCheater = savedInstanceState.getBoolean(KEY_IS_CHEATER);
mIsCheaters = savedInstanceState.getBooleanArray(KEY_CHEATER_ARRAY);
}
`