MVVMCross Android演示程序,以清除活动的后堆栈



我正在使用MvvmCross构建的Android应用程序,一个接一个地逐步完成活动,然后"返回"主页。一旦应用程序返回主页,我不希望用户能够后退一步完成之前的所有活动。

通过阅读所有的文档和博客文章等,我已经能够覆盖一个演示者,并捕获清除后台活动的请求。

所有这些代码都运行良好,但我一直无法找到如何清除活动的后堆栈。有什么想法我可以做到这一点吗?我的代码如下:

设置.cs

public class Setup : MvxAndroidSetup<Core.App>
{
protected override IMvxApplication CreateApp()
{
return new Core.App();
}
protected override void FillTargetFactories(IMvxTargetBindingFactoryRegistry registry)
{
MvxAppCompatSetupHelper.FillTargetFactories(registry);
base.FillTargetFactories(registry);
}
protected override void InitializeLastChance()
{
// Mvx.IoCProvider.ConstructAndRegisterSingleton<ICameraHelper, CameraHelper>();
base.InitializeLastChance();
}
protected override IMvxAndroidViewPresenter CreateViewPresenter()
{
var presenter = new MyAppAndroidPresenter(AndroidViewAssemblies);
Mvx.IoCProvider.RegisterSingleton<IMvxAndroidViewPresenter>(presenter);
return presenter;
}
}

MyAppAndroidPresenter.cs

public class MyAppAndroidPresenter : MvxAndroidViewPresenter
{
public MyAppAndroidPresenter(IEnumerable<Assembly> androidViewAssemblies) : base(androidViewAssemblies)
{
}
public override async Task<bool> Show(MvxViewModelRequest request)
{
if (request.PresentationValues != null)
{
if (request.PresentationValues.ContainsKey("ClearBackStack") && request.PresentationValues["ClearBackStack"] == "True")
{
// TODO : Clear the activity back stack
}
}
return await base.Show(request);
}
}

调用ViewModel

private async void NextPageMethod()
{
var presentationBundle = new MvxBundle(new Dictionary<string, string> { { "ClearBackStack", "True" } });
await NavigationService.Navigate<HomeViewModel>(presentationBundle: presentationBundle);
}

您要做的实际上是使用包含ClearTop标志的意图启动"主页"活动。根据Android开发者文档,添加此标志将导致以下行为:

例如,考虑一个由以下活动组成的任务:a、B、C、D。如果D调用startActivity()的Intent解析为活动B的组成部分,则C和D将完成,B接收给定的意图,导致堆栈现在为:A,B.

查看内置Android演示程序的MvvvmCross源代码,有几种方法可以实现这一点。最简单的方法是覆盖自定义演示程序中的CreateIntentForRequest方法。此方法将MvxViewModelRequest作为参数传递给它。因此,如果条件合适,您可以修改意向并向其添加ClearTop标志。

protected override Intent CreateIntentForRequest(MvxViewModelRequest request)
{
var intent =  base.CreateIntentForRequest(request);
if (request.PresentationValues != null) {
if (request.PresentationValues.ContainsKey("ClearBackStack") && request.PresentationValues["ClearBackStack"] == "True") {
intent.AddFlags(ActivityFlags.ClearTop);
}
}
return intent;
}

这只是实现清除后台堆栈功能的一种方法。MvvmCross是一个高度可扩展的框架,几乎所有的东西都可以自定义。

最新更新