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

MvxViewModel的SaveStateToBundle与ReloadFromBundle未触发问题

Xamarin Forms + MvvmCross 中 SaveStateToBundle/ReloadFromBundle 未触发墓碑化问题

我们开发了基于Xamarin Forms的应用,使用MvvmCross实现依赖注入、导航等功能。当前遇到的问题是:SaveStateToBundle和ReloadFromBundle方法未按预期触发——按照逻辑,Android应用进入墓碑化流程时这两个方法应自动调用,但实际测试中并未执行。

测试场景

  • 通过Android开发者选项中的「不保留活动」功能模拟墓碑化
  • 编写填充虚拟数据直至系统自动清理资源触发墓碑化的测试用例

项目环境

  • Android项目:MvvmCross 8.0.2、MvvmCross.Forms 8.0.2
  • ViewModel所在项目:.NET Standard 2.1 + MvvmCross 8.0.2

验证方式

通过Xamarin Essentials Preferences写入键值对,重启应用后检查对应值,确认这两个方法未被调用。


实现代码

LoginViewModel

public class LoginViewModel : ViewModelBase, IFirstViewModel
{
    (...)

    protected override void SaveStateToBundle(IMvxBundle bundle)
    {
        Preferences.Set("testkey", "value");
        base.SaveStateToBundle(bundle);
    }

    protected override void ReloadFromBundle(IMvxBundle state)
    {
        // 返回键对应值或默认值"nothing"
        Preferences.Get("testkey", "nothing");
        base.ReloadFromBundle(state);
    }

    (...)
}

应用配置信息

MainActivity

[Activity(
        Label = "Mobit.MES.Client",
        Icon = "@mipmap/icon",
        Theme = "@style/MainTheme",
        ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize,
        LaunchMode = LaunchMode.SingleTask)]
public class MainActivity : MvxFormsAppCompatActivity<Setup, App, UI.App>
{
    protected override void OnCreate(Bundle bundle)
    {
        (...)
        base.OnCreate(bundle);
    }
    (...)
}

Setup类

  • Setup继承自MvxFormsAndroidSetup<App, UI.App>

MVVM层App类

public class App : MvxApplication
{
    public override void Initialize()
    {
        // 注册程序集中所有Service
        CreatableTypes()
        .EndingWith("Service")
        .AsInterfaces()
        .RegisterAsLazySingleton();

        RegisterIoC();
    
        RegisterCustomAppStart<AppStart>();
    }
}

Xamarin Forms层UI.App类

C#代码

public partial class App : Application
{
    public App()
    {
        InitializeComponent();
    }
}

XAML代码

<?xml version="1.0" encoding="utf-8" ?> 
<Application xmlns="http://xamarin.com/schemas/2014/forms"              
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"              
             xmlns:controls="clr-namespace:Mobit.MES.Client.UI.Controls">    
    <Application.Resources>        
        (...)    
    </Application.Resources> 
</Application>

排查方向

  1. ViewModel继承校验:确认ViewModelBase正确继承自MvxViewModel,因为SaveStateToBundle和ReloadFromBundle是MvxViewModel的虚方法,只有继承链正确才会被MvvmCross的生命周期管理调用。
  2. Activity启动模式影响:当前设置的LaunchMode = LaunchMode.SingleTask可能改变Activity重建逻辑,尝试改为SingleTop或默认值测试是否触发状态保存。
  3. Forms页面绑定检查:确保页面使用MvxContentPage等MvvmCross Forms专属控件,MvvmCross需要通过Forms的生命周期事件触发ViewModel的状态保存逻辑。
  4. Bundle传递验证:确认MainActivity的OnCreate方法中正确将bundle传递给base.OnCreate(bundle),否则MvvmCross无法获取到之前保存的状态。
  5. 版本兼容性排查:检查MvvmCross 8.0.2版本中Forms状态保存的已知问题,或尝试升级到最新小版本测试。
  6. 手动调用测试:在ViewModel中手动调用SaveStateToBundle,验证Preferences写入逻辑是否正常,排除代码本身的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 07:00:17