You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android Activity间Intent传值部分缺失及ArrayMap异常求助

排查Intent传递Bundle数据丢失+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就能保持完整,不会被损坏。

三、额外排查点(确保万无一失)

  1. 核对常量字符串一致性
    再检查一遍你的INTENT_KEY_END_STOP_INFOINTENT_KEY_RIDE_DATE这两个常量,确保在发送方和接收方的字符串完全一致(包括大小写、拼写)——虽然部分数据能拿到,但还是要排除这种低级错误。

  2. 验证Parcelable实现正确性
    虽然mVehicleRide能正常获取,但还是要确认你的VehicleRide类的Parcelable实现没有问题:

    • writeToParcel写入字段的顺序,必须和CREATOR.createFromParcel读取的顺序完全一致;
    • 如果有嵌套的Parcelable对象,它们的实现也必须符合规范;
    • describeContents方法返回0即可(除非涉及文件描述符,一般场景不需要)。
  3. 临时替代方案:直接用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);
    
  4. 更新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

火山引擎 最新活动