You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Location extras赋值异常求助:赋值后不匹配&Bundle操作失效

Android Location Extras 行为异常解析

问题1:为什么l.extras == x返回false?

当你执行这段代码:

val l = Location("SRC")
val x = Bundle()
l.extras = x

发现l.extras == x返回false,核心原因是Location类在接收extras时,会创建传入Bundle的副本,而非直接持有原对象的引用。

Android的Location.setExtras(Bundle)方法内部,并不是简单把传入的Bundle赋值给成员变量,而是做了一次完整复制。比如源码逻辑大致如下:

public void setExtras(Bundle extras) {
    if (extras == null) {
        mExtras = null;
    } else {
        mExtras = new Bundle(extras); // 创建新Bundle对象,复制原内容
    }
}

所以l.extras拿到的是一个全新的Bundle实例,和你创建的x不是同一个对象,用==(引用相等比较)自然返回false。如果要判断内容是否一致,可以用l.extras?.equals(x),这个方法会对比Bundle内的键值对内容,而非引用。

问题2:为什么Bundle().also{location.extras=it}.putBoolean("Foo", false)后extras为空?

这个问题要结合also函数的执行顺序,再加上Location的拷贝机制来理解:

  1. 首先Bundle()创建了一个空Bundle实例,记为B;
  2. 调用also函数,把B传入lambda执行location.extras = it——此时Location会立刻复制B的空内容到内部的mExtras,这个副本记为B_copy;
  3. also执行完返回原对象B,随后调用putBoolean("Foo", false)给B添加键值对;
  4. 但Location持有的是早已复制完成的B_copy,它和原对象B没有关联,所以location.extras仍是空的B_copy,你修改的只是原BundleB而已。

如果想让Location的extras包含这个布尔值,需要先给Bundle填充数据,再赋值给Location:

Bundle().apply {
    putBoolean("Foo", false)
}.also { location.extras = it }

用apply先修改Bundle内容,再赋值,此时Location复制的就是已填充好数据的Bundle了。


内容的提问来源于stack exchange,提问作者Maneki Neko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:57:02