Activity間數(shù)據(jù)傳遞之從子Activity獲取返回結(jié)果

下面是一個(gè)測(cè)試用戶地理知識(shí)的小demo,如圖

主QuizActivity

點(diǎn)擊“CHEAT!”即用戶作弊后可以進(jìn)入子Activity,再點(diǎn)擊“SHOW ANSWER”即可顯示答案,如圖:


子CheatActivity

此時(shí)要實(shí)現(xiàn)通過(guò)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é)果

  • 實(shí)現(xiàn)子CheatActivity發(fā)送返回信息給父QuizActivity,有以下兩種方法可供調(diào)用:
    public final void setResult(int resultCode)
    public final void setResult(int resultCode, Intent data)
    一般來(lái)說(shuō),參數(shù)resultCode是以下兩個(gè)預(yù)定義常量中的一個(gè)
    Activity.RESULT_OK
    Activity.RESULT_CANCELED
    在CheatActivity中調(diào)用setResult方法,即用戶點(diǎn)擊SHOW ANSWER按鈕查看了答案,則會(huì)返回給父QuizActivity結(jié)果代碼Activity.RESULT_OK,若用戶沒(méi)有點(diǎn)擊直接后退,則返回Activity.RESULT_CANCELED

返還intent

  • 在CheatActivity中要將數(shù)據(jù)信息回傳給QuizActivity,則需要?jiǎng)?chuàng)建一個(gè)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);}
  • 用戶點(diǎn)擊SHOW ANSWER按鈕時(shí),CheatActivity調(diào)用setResult方法將結(jié)果代碼及intent打包,然后用戶單機(jī)后退鍵回到QuizActivity時(shí),ActivityManager調(diào)用activity的以下方法:
protected void onActivityResult(int requestCode, int resultCode, Intent data)

該方法參數(shù)來(lái)自QuizActivity的原始請(qǐng)求代碼及傳入setResult方法的結(jié)果代碼和intent,最后覆蓋QuizActivity的onActivityResult(int, int, Intent)方法來(lái)處理返回結(jié)果。然而,結(jié)果Intent的內(nèi)容就是CheatActivity中傳給EXTRA_ANSWER_SHOWN的值,因而還要添加一個(gè)方法來(lái)獲取到此值

public static boolean wasAnswerShown(Intent result) {    
      return result.getBooleanExtra(EXTRA_ANSWER_SHOWN, false);
}

處理返回結(jié)果

  • 在QuizActivity中新增一個(gè)成員變量保存CheatActivity回傳的值,然后覆蓋onActivityResult方法獲取它。注意檢查請(qǐng)求代碼和返回代碼是否符合預(yù)期,這是最佳代碼實(shí)踐,方便將來(lái)進(jìn)行維護(hù)
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);    
    }
}

此時(shí),QuizActivity就成功的拿到了CheatActivity回傳過(guò)來(lái)的值,完成了在Activity間的傳遞數(shù)據(jù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容