Template10 在应用暂停后恢复 运行 服务

Template10 Resume running services after app suspension

我正在开发一个使用 Microsoft Band 的 UWP 模板 10(汉堡包)应用程序,我认为我已经差不多完成了,因为我将所有服务都绑定到 Band(通过 class库项目)并且值在屏幕上完美更新。 然后我开始测试应用程序简历并遇到了一个问题。 当我重新启动应用程序时,用户将返回到值页面,但值不再更新。 基本上与乐队的联系似乎仍然有效,但 readingchanged voids 不再有效。

所以我在 MainPageViewModel OnNavigatedFromAsync 方法中添加了代码来停止所有服务没问题。 但是后来我发现当恢复 OnNavigatedToAsync 方法时没有被触发所以我不知道如何重新启动所有服务。

我还尝试在 app.xaml.cs 中添加 OnResuming 和 OnSuspendingAsync 的覆盖,但无法弄清楚如何从那里调用 MainPageViewModel 中的方法。 使用 Template10 有没有正确的方法来处理这样的事情?

我假设您正在使用 Visual Studio 中的 Simulation Dashboard 控件来暂停然后恢复您的应用程序。好吧,那就不要使用恢复按钮。它没有按预期工作。要测试应用程序的恢复,请使用暂停按钮,然后从 Band 的界面打开它(而不是使用恢复按钮)。然后 OnNavigatedToAsync 方法应该会正常启动。

更新: 根据此答案之后的讨论,我将在以下几行中提供更新的答案。

Appclass中设置静态视图模型属性,像这样:

public static TypeOfMyViewModel MyViewModel;

然后,在 TypeOfMyViewModel 构造函数中,添加以下行以将值设置为 属性:

public TypeOfMyViewModel()
{
    App.MyViewModel = this;
}

最后,在 OnResuming 方法中,只需调用 ViewModel 中的一个方法即可恢复您的服务,如下所示:

public override void OnResuming(object s, object e, AppExecutionState previousExecutionState)
{
    MyViewModel.ResumeServices();
}

当您通过 Windows 平台或 Visual Studio 暂停和恢复您的应用程序时,恢复操作非常快,因为它只是一次内存交换。在这种情况下,您的申请通常甚至不知道您的申请已被暂停。此操作的一个示例可能是您的用户收到 phone 调用,然后 returns 调用您的应用程序。使用模板 10,您的视图模型 INav 方法肯定不会被调用,因为您的应用程序的状态没有改变。如果您必须知道它已暂停并正在恢复,那么您可以在您的应用 Application/Bootstrapper 中点击 OnResuming 覆盖。根据您需要完成的工作,您可能需要通过全局静态事件公开此操作,以便您的视图模型可以以某种方式处理它。

在 Visual Studio 中使用调试位置,然后您可以 Suspend and Shutdown 这也会暂停您的应用程序,但会将其恢复状态从 PreviousExecutionState=运行 终止。在这种情况下,您的应用程序肯定不在内存中,并且肯定不在同一状态。它正在重新启动,模板 10 在此转换期间启动以恢复您的导航状态、设置和其他所有内容。它还会调用您的视图模型的 INav 覆盖,例如 NavTo 和 NavFrom。

但要小心。 Bootstrapper 的 OnResuming 也将在此操作期间被调用。对您来说幸运的是,先前的状态已传递给此覆盖,您可以在调用代码中无缝处理这种独特的情况。

有道理吗?

祝你好运。