MVVMCross Android Presenter清除活动的后退堆栈

时间:2019-02-01 09:53:17

标签: xamarin.android mvvmcross back-stack

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

通读所有文档和博客文章等,我已经能够超越演示者并捕获请求以清除活动的后退堆栈。

所有这些代码都可以正常工作,但是我一直无法找出如何清除活动的后堆栈。有什么想法可以实现这一目标吗?我的代码如下:

Setup.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);

    }

1 个答案:

答案 0 :(得分:2)

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

  

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

查看内置Android Presenter的MvvmCross源代码,有几种方法可以实现此目的。最简单的方法是在自定义演示者中重写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是一个高度可扩展的框架,几乎所有内容都可以自定义。