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

Navigation组件传Serializable参数时App切后台/点最近任务崩溃如何解决

问题根因

该序列化异常由两个核心原因触发:

  • LocationItem虽然实现了Serializable接口,但它内部持有的List<Place>对应的Place类没有实现Serializable接口,序列化完整对象链时会抛出IO异常
  • 应用切后台、点击最近任务按钮时,系统会自动将当前页面状态(包括导航参数)存入Bundle做持久化,此时会触发参数的序列化流程,因此只有这类操作时才会报错
解决方案

方案1:快速修复(基于现有Serializable实现)

给Place类也添加Serializable接口实现即可:

data class Place(
    val name: String,
    val lat: Double,
    val long: Double
) : Serializable

方案2:安卓平台推荐方案(改用Parcelable)

安卓平台更推荐使用Parcelable替代Serializable作为跨页面传递对象的实现,性能是Serializable的10倍以上,也更适配系统状态保存场景:

  1. 先在模块级build.gradle.kts中开启kotlin-parcelize插件:
plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android")
    id("kotlin-parcelize") // 新增该行
}
  1. 将LocationItem和Place都改为实现Parcelable:
import kotlinx.parcelize.Parcelize
import android.os.Parcelable

@Parcelize
data class Place(
    val name: String,
    val lat: Double,
    val long: Double
) : Parcelable

@Parcelize
data class LocationItem(
    val name: String,
    val locations: List<Place>
) : Parcelable
  1. 现有导航参数使用代码无需做任何修改,即可正常运行。
注意事项
  • 不建议长期使用Serializable作为安卓导航参数,它序列化过程会产生大量临时对象,容易触发GC,性能远低于Parcelable
  • 嵌套的自定义类型如果要做序列化/Parcelable,必须保证整个对象链里的所有自定义类型都实现了对应接口,否则会出现运行时异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:57:04