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,也会出现这个问题。至于这一种问题,还没有遇到过。

原文地址:https://www.cnblogs.com/lishbo/p/9956023.html