应用后台被杀后返回,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
相关产品推荐
相关产品推荐

