setResult(Activity.RESULT_OK)失敗分析


今天在項目中遇到一個問題,感覺有點意思,簡單描述如下:

A Activity中,調用startActivityForResult(mIntent, Constants.XXX); 跳轉到B Activity。
B Activity中,finish()方法里面,

@Override
public void finish() {
    super.finish();
    setResult(Activity.RESULT_OK);
} 

A Activity中,resultCode一直都是0,而不是Activity.RESULT_OK(值為-1)。

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(resultCode != Activity.RESULT_OK){
            return;
        }
        if(requestCode == Constants.XXX){
            refreshData();
        }
    }

在Activity.class中,我們看一下setResult()和finish()源碼,

    public final void setResult(int resultCode) {
        synchronized (this) {
            mResultCode = resultCode;
            mResultData = null;
        }
    }



    private void finish(boolean finishTask) {
        if (mParent == null) {
            int resultCode;
            Intent resultData;
            synchronized (this) {
                resultCode = mResultCode;
                resultData = mResultData;
            }
            if (false) Log.v(TAG, "Finishing self: token=" + mToken);
            try {
                if (resultData != null) {
                    resultData.prepareToLeaveProcess();
                }
                if (ActivityManagerNative.getDefault()
                        .finishActivity(mToken, resultCode, resultData, finishTask)) {
                    mFinished = true;
                }
            } catch (RemoteException e) {
                // Empty
            }
        } else {
            mParent.finishFromChild(this);
        }
    }

setResult()中設置的resultCode,先是賦值給mResultCode。然后在finish()中,ActivityManagerNative.getDefault().finishActivity(mToken, resultCode, resultData, finishTask)傳遞出去。

也就是說需要先調用setResult(),再調用finish(),setResult()方法必須在finish()之前。
所以B Activity中,finish()方法里面,需要修改為

@Override
public void finish() {
    setResult(Activity.RESULT_OK);
    super.finish();     
} 

這樣修改之后,A Activity的onActivityResult()中,接收到的resultCode就是Activity.RESULT_OK。

另外,從網上資料看到,如果在manifest文件中將B Activity的launchMode設置為了singleTask或者singleInstance,也會出現這個問題。至於這一種問題,還沒有遇到過。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM