startActivityForResult的requestCode真的可以随便定义么?

在项目中,我们经常要用到startActivityForResult,里面有个参数requestCode,经常接手别人的项目会发现这个requestCode大家定义的都很奇怪,经常还会看到之前开发者留下这么一个注释: 用于XXXX时获得Activity结果的Request代码,开发者可以随意修改。那么真的可以随意修改吗?

  • 最近在接入韩国OneStroe的SDK用于支付,从网上照搬过来的代码定义requestCode的如下
    用于购买时获得Activity结果的Request代码,开发者可以随意修改。
    private val PURCHASE_REQUEST_CODE = 1024

SDK的使用方法代码大部分都是从网上copy下来的,并且很顺利的就接入成功了,让我觉得,也没什么难度嘛。但是作为一个有追求的开发,我不能一模一样的copy代码啊,我得改改吧,于是我把之前的注释删一删,变量命名改一改,尽可能的让自己觉得,这个功能是我自己实现的。还有什么可以改的?我一开上面这个requestCode,都注释我可以随意更改, 而且我是个有个性的程序员,我要是连requestCode都一模一样使用人家的岂不是显得我太追求了么?我反手就改成

 private val PURCHASE_REQUEST_CODE = 987654321

结果再次运行的时候。。就界面毫无反应
我开始慌了....
于是我回退到刚copy下来的代码跑了一下,又可以了。换成我删了注释改了变量名的代码就毫无反应,也不崩溃。小菜鸡开始慌了....

  • 猛然惊醒,我是一名有追求的程序员,我根据我敏锐的嗅觉,不报错那肯定是把异常捕获了,点进去OneStore的拉起支付源码看到如下代码
try {
      PurchaseClient.this.launchPurchaseFlowSync(apiVersion, activity, requestCode, productId, productName, productType, payload, gameUserId, promotionApplicable, listener);
} catch (Throwable var2) {
     PurchaseClient.this.handleException(handler, listener, var2);
}

不如我所料,设置断点,通过debug发现这个var2的Throwable 为
"can only user lower 16 bits for requestcode",大概就知道报错的原因了,下面用一段完整(百度)的话作为回答:
因为requestCode不能为负数,且不能大于16个字节,要小于2的16次方,范围为0~65535
上源码
FragmentActivity-722

  @Override
    public void startActivityForResult(Intent intent, int requestCode) {
        // If this was started from a Fragment we've already checked the upper 16 bits were not in
        // use, and then repurposed them for the Fragment's index.
        if (!mStartedActivityFromFragment) {
            if (requestCode != -1) {
                checkForValidRequestCode(requestCode);
            }
        }
        super.startActivityForResult(intent, requestCode);
    }

requestCode 为 -1的时候应该是有特殊的定义且不讨论,checkForValidRequestCode这个方法应该是对requestCode 进行检查了

    /**
     * Checks whether the given request code is a valid code by masking it with 0xffff0000. Throws
     * an {@link IllegalArgumentException} if the code is not valid.
     */
    static void checkForValidRequestCode(int requestCode) {
        if ((requestCode & 0xffff0000) != 0) {
            throw new IllegalArgumentException("Can only use lower 16 bits for requestCode");
        }
    }

所以这个requestCode。。。并不能随便定义啊。。又踩坑了

你可能感兴趣的:(startActivityForResult的requestCode真的可以随便定义么?)