在项目中,我们经常要用到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。。。并不能随便定义啊。。又踩坑了