MVVMCross Android Presenter 清除活动堆栈
MVVMCross Android Presenter to clear back stack of activities
我正在使用 MvvmCross 构建的 Android 应用程序逐个执行活动,然后 "returns" 到主页。一旦应用程序 returns 进入主页,我不希望用户能够返回到之前的所有活动。
通读所有文档和博客文章等,我已经能够超越演示者并捕获清除活动后台堆栈的请求。
所有这些代码都可以正常工作,但我一直无法找出如何清除活动的后台堆栈。有什么想法可以实现吗?我的代码如下:
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);
}
您要做的实际上是使用包含 ClearTop 标志的意图启动 "Home Page" Activity。根据 Android 开发人员文档,添加此标志将导致以下行为:
For example, consider a task consisting of the activities: A, B, C, D.
If D calls startActivity() with an Intent that resolves to the
component of activity B, then C and D will be finished and B receive
the given Intent, resulting in the stack now being: A, B.
查看内置 Android 演示器的 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 是一个高度可扩展的框架,几乎所有的东西都可以定制。
我正在使用 MvvmCross 构建的 Android 应用程序逐个执行活动,然后 "returns" 到主页。一旦应用程序 returns 进入主页,我不希望用户能够返回到之前的所有活动。
通读所有文档和博客文章等,我已经能够超越演示者并捕获清除活动后台堆栈的请求。
所有这些代码都可以正常工作,但我一直无法找出如何清除活动的后台堆栈。有什么想法可以实现吗?我的代码如下:
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);
}
您要做的实际上是使用包含 ClearTop 标志的意图启动 "Home Page" Activity。根据 Android 开发人员文档,添加此标志将导致以下行为:
For example, consider a task consisting of the activities: A, B, C, D. If D calls startActivity() with an Intent that resolves to the component of activity B, then C and D will be finished and B receive the given Intent, resulting in the stack now being: A, B.
查看内置 Android 演示器的 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 是一个高度可扩展的框架,几乎所有的东西都可以定制。