下面是一個測試用戶地理知識的小demo钾怔,如圖
主QuizActivity
點擊“CHEAT!”即用戶作弊后可以進入子Activity,再點擊“SHOW ANSWER”即可顯示答案蝴蜓,如圖:
子CheatActivity
此時要實現(xiàn)通過CheatActivity把用戶是否偷看答案的情況通知給QuizActivity
- 需要從子Activity獲取返回信息,可調(diào)用一下Activity方法:
public void startActivityForResult(Intent intent, int requestCode)
在QuizActivity中添加如下代碼
private static final int REQUEST_CODE_CHEAT = 0;
在CHEAT按鍵使用startActivityForResult方法
mCheatButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
boolean answerIsTrue = mQuestionsBank[mCurrentIndex].isAnswerTrue();
Intent i = CheatActivity.newIntent(QuizActivity.this, answerIsTrue);
//startActivity(i);
startActivityForResult(i, REQUEST_CODE_CHEAT);
}
});
設(shè)置返回結(jié)果
- 實現(xiàn)子CheatActivity發(fā)送返回信息給父QuizActivity宵距,有以下兩種方法可供調(diào)用:
public final void setResult(int resultCode)
public final void setResult(int resultCode, Intent data)
一般來說伐弹,參數(shù)resultCode是以下兩個預定義常量中的一個
Activity.RESULT_OK
Activity.RESULT_CANCELED
在CheatActivity中調(diào)用setResult方法握侧,即用戶點擊SHOW ANSWER按鈕查看了答案呼畸,則會返回給父QuizActivity結(jié)果代碼Activity.RESULT_OK,若用戶沒有點擊直接后退待讳,則返回Activity.RESULT_CANCELED
返還intent
- 在CheatActivity中要將數(shù)據(jù)信息回傳給QuizActivity芒澜,則需要創(chuàng)建一個Intent,附加extra信息后耙箍,調(diào)用setResult方法將信息回傳給QuizActivity
private static final String EXTRA_ANSWER_SHOWN = "com.bignerdranch.android.geoquiz.answer_shown";
mShowAnswer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mAnswerIsTrue) {
mAnswerTextView.setText(R.string.true_button);
} else {
mAnswerTextView.setText(R.string.false_button);
}
setAnswerShownResult(true);
}
});
private void setAnswerShownResult(boolean isAnswerShown) {
Intent data = new Intent();
data.putExtra(EXTRA_ANSWER_SHOWN, isAnswerShown);
setResult(RESULT_OK, data);}
- 用戶點擊SHOW ANSWER按鈕時撰糠,CheatActivity調(diào)用setResult方法將結(jié)果代碼及intent打包酥馍,然后用戶單機后退鍵回到QuizActivity時辩昆,ActivityManager調(diào)用activity的以下方法:
protected void onActivityResult(int requestCode, int resultCode, Intent data)
該方法參數(shù)來自QuizActivity的原始請求代碼及傳入setResult方法的結(jié)果代碼和intent,最后覆蓋QuizActivity的onActivityResult(int, int, Intent)方法來處理返回結(jié)果旨袒。然而汁针,結(jié)果Intent的內(nèi)容就是CheatActivity中傳給EXTRA_ANSWER_SHOWN的值,因而還要添加一個方法來獲取到此值
public static boolean wasAnswerShown(Intent result) {
return result.getBooleanExtra(EXTRA_ANSWER_SHOWN, false);
}
處理返回結(jié)果
- 在QuizActivity中新增一個成員變量保存CheatActivity回傳的值砚尽,然后覆蓋onActivityResult方法獲取它施无。注意檢查請求代碼和返回代碼是否符合預期,這是最佳代碼實踐必孤,方便將來進行維護
private boolean mIsCheater;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != Activity.RESULT_OK) {
return;
}
if (requestCode == REQUEST_CODE_CHEAT) {
if (data == null) {
return;
}
mIsCheater = CheatActivity.wasAnswerShown(data);
}
}
此時猾骡,QuizActivity就成功的拿到了CheatActivity回傳過來的值,完成了在Activity間的傳遞數(shù)據(jù)