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

KMP Android应用退至后台崩溃,Activity重启丢失用户输入

KMP Android后台恢复Activity崩溃问题排查求助

环境信息

  • Android Studio Giraffe | 2022.3.1 Patch 2
  • VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
  • macOS 13.6.1
  • Kotlin Multiplatform版本1.9.10,Gradle Plugin 8.1.0

报错信息

FATAL EXCEPTION: main
Process: org.haspohr.cmr, PID: 3145
android.os.BadParcelableException: Parcelable encountered IOException writing serializable object (name = org.haspohr.cmr12.screens.StartScreen)
    at android.os.Parcel.writeSerializable(Parcel.java:2797)
    at android.os.Parcel.writeValue(Parcel.java:2563)
    at android.os.Parcel.writeValue(Parcel.java:2362)
    at android.os.Parcel.writeList(Parcel.java:1415)
    at android.os.Parcel.writeValue(Parcel.java:2506)
    at android.os.Parcel.writeValue(Parcel.java:2362)
    at android.os.Parcel.writeList(Parcel.java:1415)
    at android.os.Parcel.writeValue(Parcel.java:2506)
    at android.os.Parcel.writeValue(Parcel.java:2362)
    at android.os.Parcel.writeArrayMapInternal(Parcel.java:1298)
    at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1843)
    at android.os.Bundle.writeToParcel(Bundle.java:1389)
    at android.os.Parcel.writeBundle(Parcel.java:1367)
    at android.os.Parcel.writeValue(Parcel.java:2479)
    at android.os.Parcel.writeValue(Parcel.java:2369)
    at android.os.Parcel.writeArrayMapInternal(Parcel.java:1298)
    at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1843)
    at android.os.Bundle.writeToParcel(Bundle.java:1389)
    at android.os.Parcel.writeBundle(Parcel.java:1367)
    at android.os.Parcel.writeValue(Parcel.java:2479)
    at android.os.Parcel.writeValue(Parcel.java:2369)
    at android.os.BaseBundle.dumpStats(BaseBundle.java:1917)
    at android.os.BaseBundle.dumpStats(BaseBundle.java:1954)
    at android.app.servertransaction.PendingTransactionActions$StopInfo.collectBundleStates(PendingTransactionActions.java:123)
    at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:139)
    at android.os.Handler.handleCallback(Handler.java:958)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loopOnce(Looper.java:205)
    at android.os.Looper.loop(Looper.java:294)
    at android.app.ActivityThread.main(ActivityThread.java:8177)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)
Caused by: java.io.NotSerializableException: org.haspohr.cmr12.GameViewModel
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1240)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1620)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1581)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1490)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1234)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:354)
    at android.os.Parcel.writeSerializable(Parcel.java:2792)
    at android.os.Parcel.writeValue(Parcel.java:2563) 
    at android.os.Parcel.writeValue(Parcel.java:2362) 
    at android.os.Parcel.writeList(Parcel.java:1415) 
    at android.os.Parcel.writeValue(Parcel.java:2506) 
    at android.os.Parcel.writeValue(Parcel.java:2362) 
    at android.os.Parcel.writeList(Parcel.java:1415) 
    at android.os.Parcel.writeValue(Parcel.java:2506) 
    at android.os.Parcel.writeValue(Parcel.java:2362) 
    at android.os.Parcel.writeArrayMapInternal(Parcel.java:1298) 
    at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1843) 
    at android.os.Bundle.writeToParcel(Bundle.java:1389) 
    at android.os.Parcel.writeBundle(Parcel.java:1367) 
    at android.os.Parcel.writeValue(Parcel.java:2479) 
    at android.os.Parcel.writeValue(Parcel.java:2369) 
    at android.os.Parcel.writeArrayMapInternal(Parcel.java:1298) 
    at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1843) 
    at android.os.Bundle.writeToParcel(Bundle.java:1389) 
    at android.os.Parcel.writeBundle(Parcel.java:1367) 
    at android.os.Parcel.writeValue(Parcel.java:2479) 
    at android.os.Parcel.writeValue(Parcel.java:2369) 
    at android.os.BaseBundle.dumpStats(BaseBundle.java:1917) 
    at android.os.BaseBundle.dumpStats(BaseBundle.java:1954) 
    at android.app.servertransaction.PendingTransactionActions$StopInfo.collectBundleStates(PendingTransactionActions.java:123) 
    at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:139) 
    at android.os.Handler.handleCallback(Handler.java:958) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loopOnce(Looper.java:205) 
    at android.os.Looper.loop(Looper.java:294) 
    at android.app.ActivityThread.main(ActivityThread.java:8177) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971) 

问题描述

开发的KMP项目可在iOS和Android平台成功构建,但Android应用退至后台后无法正常恢复Activity,每次都会重建Activity并丢失用户之前的所有输入。排查发现问题源于序列化对象写入异常,不清楚后续排查方向,也不确定需要提供多少代码(或完整仓库链接)以便有类似经验的人复现问题,寻求建议。

具体场景:模拟器按Esc键或真机按Home键将应用退至后台时,应用本该恢复Activity,实际却重启并丢失输入。

GameViewModel初始代码

class GameViewModel{
    private val _uiState = MutableStateFlow(GameUiState())
    val uiState: StateFlow<GameUiState> = _uiState.asStateFlow()
    var focussed:Int=0
    init {
        updateBSA()
        updateECV()
    }
    fun reset()
    {
        _uiState.value=GameUiState()
        updateBSA()
        updateECV()
        accept()
        focussed=0
    }

    fun updateWeight(w: String) {
        _uiState.update { currentState -> currentState.copy(weightVal = if (w.isNotBlank()) w else "") }
        _uiState.update { currentState -> currentState.copy(bsaChanged = true) }
        updateBSA()
    }

    fun togglepapillary(i:Int) {
        _uiState.update { currentState -> currentState.copy(papillary = i==1)}
    }
}

尝试修改后的问题

将类声明改为:

class GameViewModel: Serializable {

此时Serializable被标红,提示信息翻译为:

  • 该类型包含构造函数,必须在此处初始化
  • 该类型为final,无法被继承

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:44:55