關於startActivityForResult

Rayho發表於2018-06-06

1. startActivityForResult的使用場景是什麼?onActivityResult回撥裡面的resultCode和requestCode含義是什麼?

  • 當A activity開啟B activity時,需要從B activity返回資料給A activity時,必須呼叫startActivityForResult。

  • requestCode:請求碼。請求碼的值是根據業務需求由自己決定,用來標識請求的來源。確定返回的資料是來自哪個activity。

  • resultCode:結果碼。決定返回結果的型別,一般為系統預設的RESULT_OK或者RESULT_CANCELED

2. Activity A啟動B的時候,在B中何時該執行setResult ?setResult可以位於Activity的finish方法之後嗎?

public final void setResult(int resultCode, Intent data) {  
        synchronized (this) {  
            mResultCode = resultCode;  
            mResultData = data;  
        }  
}  
 ......................
public void finish() {  
        if (mParent == null) {  
            int resultCode;  
            Intent resultData;  
            synchronized (this) {  
                resultCode = mResultCode;  
                resultData = mResultData;  
            }  
            if (Config.LOGV) Log.v(TAG, "Finishing self: token=" + mToken);  
            try {  
                if (ActivityManagerNative.getDefault()  
                    .finishActivity(mToken, resultCode, resultData)) {  
                    mFinished = true;  
                }  
            } catch (RemoteException e) {  
                // Empty  
            }  
        } else {  
            mParent.finishFromChild(this);  
        }  
   } 
複製程式碼
  • 從Activity中看出finish()裡的resultCode和resultData的值是在setResult呼叫後才獲取的,不然值會為空。
  • 所以setResult一般是在onBackPressed中呼叫,而且必須是在super.onBackPressed()之前。或者根據業務情景,顯示呼叫setResult,然後finish()。

相關文章