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