Android startActivityForResult

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

场景:Activity或者Fragment开启一个新活动,并且希望接收新活动一些信息。比如最常用的选择照片再如选择地址、选择信息等。
resultCode:在新活动里面setResult(int resultCode)用到,系统提供的有RESULT_CANCELED、RESULT_OK、RESULT_FIRST_USER三种,当然也可以自定义数值。
requestCode:在启动Activity时startActivityForResult(Intent intent, int requestCode) 传入请求码,用于在onActivityResult中判断处理结果来自哪个活动。

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

回答上面问题之前先简单看下setResult和finish得源码

    public final void setResult(int resultCode) {
        synchronized (this) {
            mResultCode = resultCode;
            mResultData = null;
        }
    }
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 (ActivityManager.getService()
                        .finishActivity(mToken, resultCode, resultData, finishTask)) {
                    mFinished = true;
                }
            } catch (RemoteException e) {
                // Empty
            }
        } else {
            mParent.finishFromChild(this);
        }
    }

由上面源码可知当我们调用setResult时只是对mResultCode和mResultData进行了赋值,没有做传递参数得工作,真正得数据返回是再finish里面。因此setResult 应该在finish之前调用才起作用,虽然也可以在finish之后调用,但是onActivityResult将无法正常接收数据。

需要注意的几点:
1、被启动的Activity不能放入不同的任务栈,否则会直接调用onActivityResult方法,并且resultCode为0。不过在 Android 5.0 以上 AMS 在处理manifest.xml 文件中的 singleTask 和 singleInstance
信息不会创建新的 任务栈,因此可以收到正常回调。但是在 Android 4.4.4 还是会创建新的任务栈,导致无法正常接收数据。
2、requestCode 必须大于0

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值