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

API 33后Intent/Bundle获取Parcelable对象的替代方案咨询

解决API 33+ 中Parcelable对象通过Intent/Bundle传递的问题

核心原因

API 33(Android 13)开始,getParcelableExtra(String)和Bundle.getParcelable(String)等无类型参数的方法被标记为废弃,替代方案是使用带Class<T>参数的重载方法,以此提供更安全的类型检查。

方案1:直接通过Intent传递(推荐)

发送端代码无需修改,原来的putExtra方法依然可用:

val intent = Intent(this, YourTargetActivity::class.java)
intent.putExtra("barcodeListItem", listItem)
startActivity(intent)

接收端根据API版本选择对应的获取方法:

val listItem = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    // API 33+ 使用带类参数的重载方法
    intent.getParcelableExtra("barcodeListItem", BarcodeListItem::class.java)
} else {
    // 低版本使用旧方法,添加注解抑制废弃警告
    @Suppress("DEPRECATION")
    intent.getParcelableExtra<BarcodeListItem>("barcodeListItem")
}

方案2:通过Bundle传递

发送端代码保持不变:

val bundle = Bundle()
bundle.putParcelable("barcodeListItem1", listItem)
val intent = Intent(this, YourTargetActivity::class.java)
intent.putExtras(bundle)
startActivity(intent)

接收端调整为带类参数的getParcelable方法:

val bundle = intent.extras
val listItem = bundle?.run {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        getParcelable("barcodeListItem1", BarcodeListItem::class.java)
    } else {
        @Suppress("DEPRECATION")
        getParcelable<BarcodeListItem>("barcodeListItem1")
    }
}

注意事项

确保BarcodeListItem类正确实现Parcelable接口:

  • 重写writeToParcel方法,将所有字段写入Parcel
  • 实现CREATOR静态内部类,负责从Parcel中重建对象
  • 如果是Kotlin数据类,可以使用@Parcelize注解自动生成Parcelable实现(需要在build.gradle中启用kotlin-parcelize插件)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 22:28:12