美文网首页
关于startActivityForResult

关于startActivityForResult

作者: Kael_祈求者 | 来源:发表于2017-12-10 15:28 被阅读0次

1、startActivityForResult的使用场景是什么?onActivityResult回调里面的resultCode和requestCode含义是什么?

 a.startActivityForResult: 一般用于启动一个Activity并且可以回传数据; 比如选择短信界面 选择 联系人后,
  返回到短信界面刷新已选中的号码;

 b.requestCode: 请求码 用于标识startActivityForResult()方法打开多个不同的Activity处理不同的业务;
   为了知道返回的数据来自于哪个新Activity,所以用requestCode来区别判断

 c.resultCode: 结果码 用于标识那个新Activity关闭后返回结果,一般用Result_OK或者RESULT_CANCELED, 但是也可以自己定义
   唯一的

2、Activity A启动B的时候,在B中何时该执行setResult ?setResult可以位于Activity的finish方法之后吗?

首先来看下Activity中的finish()方法 和 setResult源码:
    public final void setResult(int resultCode, Intent data) {
        synchronized (this) {
            mResultCode = resultCode;
            mResultData = data;
        }
    }

     private void finish(int 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(this);
                }
                if (ActivityManagerNative.getDefault()
                        .finishActivity(mToken, resultCode, resultData, finishTask)) {
                    mFinished = true;
                }
            } catch (RemoteException e) {
                // Empty
            }
        } else {
            mParent.finishFromChild(this);
        }
    }

 (1)Activity A启动B的时候,在B中何时该执行setResult ? 一般用于关闭当前Activity,finish()方法之前执行。
     如果不在finish()方法之前执行的话,那么onActivityResult回调中 resultCode 会为RESULT_CANCELED 并且
     resultData 为null 从上面的源码中可以看出。

 (2)setResult可以位于Activity的finish方法之后吗?  不行,如果放在Activity的finish方法之后的话,从上面源码分析得出
             if (ActivityManagerNative.getDefault()
                        .finishActivity(mToken, resultCode, resultData, finishTask)) {
                    mFinished = true;
                }
   将空的resultCode 和 resultData 已经返回出去了,所以在finish()方法之后调用setResult就已经没有效果了,无法返回


相关文章

网友评论

      本文标题:关于startActivityForResult

      本文链接:https://www.haomeiwen.com/subject/rgomixtx.html