今天在项目中遇到一个问题,感觉有点意思,简单描述如下:

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

更多相关文章

  1. Android(安卓)编程下 Touch 事件的分发和消费机制
  2. Android(安卓)4.0 截屏(Screenshot)代码流程小结
  3. 2020Android初中级面试知识点记录——Android篇
  4. 防止滑盖事件造成crash
  5. 【Android】 JNI入门 - NDK从入门到精通
  6. android service 之startService(...)
  7. 【072】◀▶ Android(安卓)(IV) - 显示及后台
  8. android 串口jni 开发流程
  9. Android网络解析

随机推荐

  1. 使用eclipse进行android C/C++ 开发环境
  2. Android(安卓)8.0 启动速度优化工具
  3. 通信--------android 客户端 与 web 服务
  4. android activity 基类 通用方法
  5. Android中通过pid获取app包名
  6. Android录屏的三种方案
  7. Android 中设置桌面背景
  8. Android app获取android.permission.BATT
  9. Android canvas.drawArc() 画圆弧
  10. Android 笑话+html 实例开发(详解)