Android Activity间Intent传值部分缺失及ArrayMap异常求助
从你提供的代码和异常日志来看,问题的核心是Branch SDK在处理Intent时破坏了Bundle的内部结构,导致部分键值对无法正常读取,同时触发了ArrayMap的RuntimeException。下面是具体的排查步骤和解决方案:
一、先定位异常根源
看你的异常栈信息:
W/ArrayMap: New hash 0 is before end of array hash 235905106 at index 2 key
java.lang.RuntimeException: here
at android.util.ArrayMap.append(ArrayMap.java:547)
...
at io.branch.referral.Branch.checkIntentForSessionRestart(Branch.java:2540)
这个异常明确指向Branch SDK在解析Intent的Bundle时,导致ArrayMap(Bundle的底层存储结构)损坏,进而让后续读取部分键值对时返回null。
二、优先解决:阻止Branch SDK干扰你的自定义Intent
Branch提供了专门的标记,让你可以指定某个Intent不被Branch处理,避免它修改你的Bundle数据。在启动ConfirmationActivity时添加这个标记:
Intent intent = new Intent(this, ConfirmationActivity.class); // ... 你的原有数据填充代码 ... intent.putExtra(Branch.FLAG_REQUEST_BRANCH_DISABLED, true); // 新增这行代码 startActivityForResult(intent, 1);
这个flag会告诉Branch SDK跳过对这个Intent的处理,你的Bundle就能保持完整,不会被损坏。
三、额外排查点(确保万无一失)
核对常量字符串一致性
再检查一遍你的INTENT_KEY_END_STOP_INFO和INTENT_KEY_RIDE_DATE这两个常量,确保在发送方和接收方的字符串完全一致(包括大小写、拼写)——虽然部分数据能拿到,但还是要排除这种低级错误。验证Parcelable实现正确性
虽然mVehicleRide能正常获取,但还是要确认你的VehicleRide类的Parcelable实现没有问题:writeToParcel写入字段的顺序,必须和CREATOR.createFromParcel读取的顺序完全一致;- 如果有嵌套的Parcelable对象,它们的实现也必须符合规范;
describeContents方法返回0即可(除非涉及文件描述符,一般场景不需要)。
临时替代方案:直接用Intent.putExtra传递
如果添加Branch标记后还是有问题,可以尝试跳过Bundle,直接用Intent的putExtra逐个传递数据:Intent intent = new Intent(this, ConfirmationActivity.class); String startStopInfo = String.format("%s - %s", mVehicleRide.getStartStopInfo().getDepartureTime(), mVehicleRidesFromStopsResponse.getStartStopName()); String endStopInfo = String.format("%s - %s", mVehicleRide.getEndStopInfo().getDepartureTime(), mVehicleRidesFromStopsResponse.getEndStopName()); intent.putExtra(INTENT_KEY_START_STOP_INFO, startStopInfo); intent.putExtra(INTENT_KEY_END_STOP_INFO, endStopInfo); intent.putExtra(INTENT_KEY_ROUTE_STOP_INFO, mVehicleRide); intent.putExtra(INTENT_KEY_RIDE_DATE, mVehicleRidesFromStopsResponse.getDate()); intent.putExtra(Branch.FLAG_REQUEST_BRANCH_DISABLED, true); startActivityForResult(intent, 1);接收时直接用:
mStartStopInfo = getIntent().getStringExtra(INTENT_KEY_START_STOP_INFO); mEndStopInfo = getIntent().getStringExtra(INTENT_KEY_END_STOP_INFO); mVehicleRide = getIntent().getParcelableExtra(INTENT_KEY_ROUTE_STOP_INFO); mDate = getIntent().getStringExtra(INTENT_KEY_RIDE_DATE);更新Branch SDK到最新版本
这个ArrayMap的异常有可能是Branch旧版本的bug,尝试将Branch SDK升级到最新稳定版,看看官方是否已经修复了这个问题。
四、验证数据是否真的被正确放入
在启动Activity前,先打印Bundle里的所有数据,确认发送方确实把值放进去了:
Log.d("BundleCheck", "StartStopInfo: " + bundle.getString(INTENT_KEY_START_STOP_INFO)); Log.d("BundleCheck", "EndStopInfo: " + bundle.getString(INTENT_KEY_END_STOP_INFO)); Log.d("BundleCheck", "RideDate: " + bundle.getString(INTENT_KEY_RIDE_DATE));
如果这里打印都正常,那100%是后续有代码(也就是Branch SDK)修改了你的Bundle,添加Branch禁用标记就能解决。
内容的提问来源于stack exchange,提问作者Sudhanshu Mishra




