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

使用Navigation Compose类型安全路由从其他应用返回时遇异常

问题解决:Navigation Compose类型安全路由后台恢复序列化异常

核心原因

你遇到的NotSerializableException是因为Android系统在保存/恢复Activity状态时,使用的是Java原生的Serializable/Parcelable机制,而Kotlinx Serialization的@Serializable注解仅适用于Kotlin自身的序列化框架,和Android的状态序列化体系不兼容。当应用后台被杀死后,Navigation尝试恢复BackStack状态时,无法将你的HomeRoute对象序列化到Bundle中,从而抛出异常。

解决方案

1. 让路由对象实现Serializable接口

直接给你的data object路由添加Serializable接口实现,Kotlin的data object天生支持实现接口:

@Serializable
data object HomeRoute : Serializable // 新增Serializable接口

如果是带参数的路由(比如data class类型),同样需要让路由本身或参数类实现Serializable:

@Serializable
data class DetailRoute(val itemId: String) : Serializable

2. 确保所有路由参数可序列化

如果你的路由携带自定义数据类作为参数,必须保证这些数据类也实现Serializable或Parcelable接口,避免嵌套对象导致序列化失败。

3. 适配Navigation Compose版本

确保你的Navigation Compose版本与Kotlin版本兼容,Kotlin 2.0.21建议使用2.7.7及以上的Navigation Compose版本,该版本对类型安全路由的状态恢复做了优化:

// 在模块级build.gradle.kts中配置
implementation("androidx.navigation:navigation-compose:2.7.7")

4. 保持路由对象纯净

避免在路由对象中包含不可序列化的成员(比如回调函数、Context实例、未实现序列化的自定义类等),路由应仅作为导航标识,业务数据建议通过ViewModel传递,而非路由参数。

验证步骤

修改后,按以下流程测试:

  • 启动应用,进入对应路由页面
  • 按Home键将应用后台化,可通过开发者选项的“不保留活动”加速进程杀死
  • 重新唤起应用,检查是否正常恢复无崩溃

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 09:47:04