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
相关产品推荐
相关产品推荐

