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

