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

应用后台被杀后返回,Fragment获取ViewModel失败问题求助

问题:应用后台被杀死后返回崩溃(Parcel解包异常)

我可以通过开发者选项中的「不保留活动」或直接在后台杀死应用进程来复现该崩溃,崩溃发生在返回应用时。怀疑该崩溃是迁移到Hilt后出现的,因为它出现在该版本的Crashlytics中。

崩溃堆栈追踪

Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@9a22257: Unmarshalling unknown type code 4456513 at offset 5188
    at android.os.Parcel.readValue(Parcel.java:2755)
    at android.os.Parcel.readArrayMapInternal(Parcel.java:3043)
    at android.os.BaseBundle.unparcel(BaseBundle.java:257)
    at android.os.Bundle.getParcelableArrayList(Bundle.java:934)
    at androidx.lifecycle.SavedStateHandle$Companion.createHandle(SavedStateHandle.kt:381)
    at androidx.lifecycle.SavedStateHandleSupport.createSavedStateHandle(SavedStateHandleSupport.kt:70)
    at androidx.lifecycle.SavedStateHandleSupport.createSavedStateHandle(SavedStateHandleSupport.kt:103)
    at androidx.lifecycle.AbstractSavedStateViewModelFactory.create(AbstractSavedStateViewModelFactory.kt:90)
    at dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.create(HiltViewModelFactory.java:114)
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:187)
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:153)
    at com.megamod.mages.details.ui.overview.OverviewFragment$vm$2.invoke(OverviewFragment.kt:59)
    at com.megamod.mages.details.ui.overview.OverviewFragment$vm$2.invoke(OverviewFragment.kt:59)
    at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
    at com.megamod.mages.details.ui.overview.OverviewFragment.getVm(OverviewFragment.kt:59)
    at com.megamod.mages.details.ui.overview.OverviewFragment.onCreate(OverviewFragment.kt:75)
    at androidx.fragment.app.Fragment.performCreate(Fragment.java:3090)
    at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:475)
    at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:257)
    at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:113)
    at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1433)
    at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2977)
    at androidx.fragment.app.FragmentManager.dispatchCreate(FragmentManager.java:2884)
    at androidx.fragment.app.FragmentController.dispatchCreate(FragmentController.java:252)
    at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:220)
    at com.megamod.core.ui.AppActivity.onCreate(AppActivity.kt:38)
    at com.megamod.mages.details.ui.MagesDetailsActivity.onCreate(MagesDetailsActivity.kt:54)
    at android.app.Activity.performCreate(Activity.java:6975)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) 
    at android.app.ActivityThread.-wrap11(Unknown Source:0) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593) 
    at android.os.Handler.dispatchMessage(Handler.java:105) 
    at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:6541) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 

相关代码示例

OverviewFragment代码:

@AndroidEntryPoint
class OverviewFragment : AppFragment() {

    private val vm: OverviewViewModel by viewModels()
    ...

}

OverviewViewModel代码:

@HiltViewModel
class OverviewViewModel @Inject constructor(
    private val schedulers: Schedulers,
    private val session: OptionalSession,
    private val apiClient: ApiClient
) : GandalfRoomViewModel() {
    ...
}

解决方案

  • 检查SavedState中的可序列化对象:异常发生在SavedStateHandle恢复阶段,说明ViewModel的SavedState中存储了无法被Parcel解包的对象。检查ViewModel是否通过SavedStateHandle存储了未实现Parcelable或Serializable接口的自定义类,若有则修改类实现对应接口,或改用ViewModelScope缓存、本地数据库等方式存储此类对象。
  • 验证Hilt与Jetpack组件版本兼容性:迁移到Hilt后出现问题,大概率是版本不匹配导致的序列化逻辑异常。统一升级dagger-hilt、androidx.lifecycle相关依赖到最新稳定版本,确保版本相互兼容。
  • 排查ViewModel父类逻辑:检查GandalfRoomViewModel是否重写了SavedState相关方法,或存在自定义状态存储逻辑干扰了默认的SavedState机制。若父类处理不当,需调整其实现以适配Hilt的SavedStateHandle逻辑。
  • 确认依赖对象的使用方式:OptionalSession、ApiClient是构造注入的依赖,确保ViewModel未将这些对象存入SavedState中——此类服务型对象无需持久化,仅需作为注入实例使用即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 23:55:20