Xamarin.Android应用进程被系统杀死后重启崩溃,如何正确从闪屏页重启
问题根因
原来的方案存在两个核心问题导致不生效:
- PID校验逻辑没有放在
OnCreate方法最开头,调用base.OnCreate后MVVMCross会优先执行ViewModel、服务的状态恢复逻辑,进程重建后这些依赖都不存在,会提前触发崩溃 - 跳转启动 SplashScreen 后没有终止后续代码执行,原有Activity的初始化逻辑仍然会运行
正确实现方案
方案1:PID校验适配版(和你原有逻辑兼容)
第一步:BaseActivity中添加常量定义
private const string PROCESS_ID = "saved_process_id";
第二步:重写OnSaveInstanceState(原有逻辑可直接保留)
protected override void OnSaveInstanceState(Bundle outState) { outState.PutInt(PROCESS_ID, Process.MyPid()); base.OnSaveInstanceState(outState); }
第三步:OnCreate开头添加校验逻辑(核心修改点)
protected override void OnCreate(Bundle savedInstanceState) { // 校验逻辑必须放在最开头,早于base.OnCreate调用 if (savedInstanceState != null) { // SplashScreen不需要校验,避免循环跳转 if (this.GetType() != typeof(SplashScreen)) { var currentPID = Process.MyPid(); var savedPID = savedInstanceState.GetInt(PROCESS_ID); if (currentPID != savedPID) { var intent = new Intent(ApplicationContext, typeof(SplashScreen)); intent.SetFlags(ActivityFlags.NewTask | ActivityFlags.ClearTask); StartActivity(intent); // 清除当前栈所有Activity,彻底清理残留 FinishAffinity(); Finish(); // 终止后续所有初始化逻辑 return; } } } base.OnCreate(savedInstanceState); // 你的其他OnCreate业务逻辑 }
方案2:MVVMCross专属适配方案(更稳定)
针对MVVMCross框架特性,进程被杀死后全局IoC容器会被销毁,直接判断容器初始化状态即可,无需额外保存PID:
protected override void OnCreate(Bundle savedInstanceState) { if (savedInstanceState != null && !Mvx.IoCProvider.IsInitialized) { var intent = new Intent(ApplicationContext, typeof(SplashScreen)); intent.SetFlags(ActivityFlags.NewTask | ActivityFlags.ClearTask); StartActivity(intent); FinishAffinity(); Finish(); return; } base.OnCreate(savedInstanceState); // 其他业务逻辑 }
注意事项
- SplashScreen需要在AndroidManifest中配置为
MainLauncher = true,且初始化逻辑要包含MVVMCross框架的完整初始化流程 - 如果启用了Xamarin链接器,需要给
Mvx.IoCProvider、PROCESS_ID常量添加[Preserve]标记,避免被误裁剪
内容的提问来源于stack exchange,提问作者AlexTsy
相关产品推荐
相关产品推荐

