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

  • 相关阅读:
    Servlet的生命周期
    Servlet中的请求与响应
    Servlet中的相关的配置文件信息:
    转发与重定向的区别,笔记无法转过来,所以直接放链接了,可以直接查看
    JSP入门中的一些案例代码:
    一些已经有些模糊的小知识(一)
    JSP入门五之request,out,response对象的应用
    JSP入门四
    JSP入门三 不知道如何将笔记同步过来只能这样了
    来自(乐唯科技)的面试问题..
  • 原文地址:https://www.cnblogs.com/lishbo/p/9956023.html
Copyright © 2011-2022 走看看