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

