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

  • 相关阅读:
    1049: 贝贝的车牌问题(car)
    漂亮的验证码(.Net MVC)
    低危漏洞- X-Frame-Options Header未配置
    Linq中的连接(join)
    定时执行任务FluentScheduler
    NET定时任务执行管理器开源组件–FluentScheduler
    在ASP.NET中如何运行后台任务
    【译】微型ORM:PetaPoco
    3389凭据不工作
    C# LDAP认证登录
  • 原文地址:https://www.cnblogs.com/lishbo/p/9956023.html
Copyright © 2020-2023  润新知