Android 13 (SDK 33):Bundle.getSerialized(String) 已弃用,有什么替代方案?

问题描述 投票:0回答:4

从 API 级别 33 开始,Bundle 类的

getSerializable(String)
方法已弃用。文档建议使用
getSerializable(String, Class)
代替。但该功能仅适用于 API 级别 33。

我当前的代码:

val model = args.getSerializable("key") as? Model

现在应该是这样吗?

val model = args.customGetSerializable<Model>("key")

@Suppress("DEPRECATION")
inline fun <reified T : Serializable> Bundle.customGetSerializable(key: String): T? {
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        getSerializable(key, T::class.java)
    } else {
        getSerializable(key) as? T
    }
}
android kotlin bundle serializable
4个回答
7
投票

现在应该是这样吗?

是的。

理想情况下,Google 会在

BundleCompat
中添加内容以应对这些更改,也许他们现在会这样做,因为 Android 13 已开始向用户交付。


1
投票

为 Kotlin 提供了很多示例和解决方案,但 java 似乎没有得到任何帮助。这里有一个有效的 java 解决方案:-

List<ClassName> variable;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    //noinspection unchecked
    Class<? extends ArrayList<ClassName>> type = (Class<? extends ArrayList<ClassName>>) new ArrayList<>().getClass();
    variable = bundle.getSerializable("reference", type);
} else {
    //noinspection unchecked,deprecation
    variable = (List<ClassName>) bundle.getSerializable("reference");
}

0
投票

您可以做的是将您的枚举设置为Parcelable。使用@Parcelize可以轻松完成。

之后,您可以用 BundleCompat.getParcelable() 替换已弃用的 getSerialized()

但是当你调用 putExtra() 时需要小心,因为你的 Enum 现在实现了 Serialized 和 Parcelable,所以,你需要像这样 putExtra(enum as Parcelable) 那样强制你的 Enum 作为 Parceable


0
投票

如果您觉得 BundleCompaptIntentCompat 版本更长,您可以创建这样的扩展并使用

inline fun <reified T: Parcelable> Bundle.getParcel(key: String): T? =
    BundleCompat.getParcelable(this, key, T::class.java)

inline fun <reified T: Parcelable> Intent.getParcel(key: String): T? =
    IntentCompat.getParcelableExtra(this, key, T::class.java)
© www.soinside.com 2019 - 2024. All rights reserved.