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

Xamarin.Android应用进程被系统杀死后重启崩溃,如何正确从闪屏页重启

问题根因

原来的方案存在两个核心问题导致不生效:

  1. PID校验逻辑没有放在OnCreate方法最开头,调用base.OnCreate后MVVMCross会优先执行ViewModel、服务的状态恢复逻辑,进程重建后这些依赖都不存在,会提前触发崩溃
  2. 跳转启动 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 13:30:05