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

