setResult(Activity.RESULT_OK)失败分析
16lz
2021-01-24
今天在项目中遇到一个问题,感觉有点意思,简单描述如下:
A Activity中,调用startActivityForResult(mIntent, Constants.XXX); 跳转到B Activity。
B Activity中,finish()方法里面,
@Overridepublic 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()方法里面,需要修改为
@Overridepublic void finish() { setResult(Activity.RESULT_OK); super.finish(); }
这样修改之后,A Activity的onActivityResult()中,接收到的resultCode就是Activity.RESULT_OK。
另外,从网上资料看到,如果在manifest文件中将B Activity的launchMode设置为了singleTask或者singleInstance,也会出现这个问题。至于这一种问题,还没有遇到过。
更多相关文章
- Android(安卓)编程下 Touch 事件的分发和消费机制
- Android(安卓)4.0 截屏(Screenshot)代码流程小结
- 2020Android初中级面试知识点记录——Android篇
- 防止滑盖事件造成crash
- 【Android】 JNI入门 - NDK从入门到精通
- android service 之startService(...)
- 【072】◀▶ Android(安卓)(IV) - 显示及后台
- android 串口jni 开发流程
- Android网络解析