【问题标题】:Template10 Resume running services after app suspensionTemplate10 应用暂停后恢复运行服务
【发布时间】:2016-03-07 05:39:04
【问题描述】:

我正在开发一个使用 Microsoft Band 的 UWP 模板 10 (Hamburger) 应用程序,我认为我已经完成了很多工作,因为我将所有服务都绑定到 Band(通过类库项目)和值在屏幕上完美更新。 然后我开始测试应用程序简历并遇到了一个问题。 当我重新启动应用程序时,用户将返回值页面,但值不再更新。 基本上与乐队的连接似乎仍然有效,但读数变化的空隙不再起作用。

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

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

【问题讨论】:

    标签: c# winrt-xaml win-universal-app template10


    【解决方案1】:

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

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

    在App 类中设置静态视图模型属性,如下所示:

    public static TypeOfMyViewModel MyViewModel;
    

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

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

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

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

    【讨论】:

    • 啊好吧有趣,我一直在使用简历选项是的。正如您所说,使用生命周期事件中的简历不会调用 OnNavigatedToAsync。但是,它仍然无法按预期工作。如果我暂停应用程序然后从开始菜单重新启动它,那么我可以将 OnNavigated 捕获到 Async 并重新启动所有内容,然后我的值会再次开始更新,太好了:) 但是如果我尝试使用任务列表恢复(长按在后退箭头上)事件仍然没有触发,服务也没有重新启动..
    • 啊,对不起,你是对的,它不会触发。但是,我认为当应用程序暂停时您根本不应该停止您的服务。根据Developer's Guide to Windows 10,应用程序生命周期一集,Windows 会为你做这件事。返回应用程序后,应恢复您的代码。在暂停之前启动的所有异步调用都将返回错误。更多详细信息,请参阅从大约 12 分钟开始的视频。
    • 是的,我没想到必须停止所有服务,这正是我最终试图让一切恢复运行的地方。对于乐队,我认为不会进行任何异步调用。你触发一个异步命令来启动它们,例如'await _bandClient.SensorManager.RRInterval.StartReadingsAsync();'然后,您只需收听乐队提升事件 '_bandOperator.EventRRIntervalChanged += _bandOperator_EventRRIntervalChanged;'在恢复这些事件之后,如果不再次调用第一段代码,就不会再引发。
    • 我想我想到的唯一解决方案是在 App 类中创建一个静态属性来保存对 ViewModel 的引用,并在 OnResuming 方法中调用一些 ViewModel 方法来处理恢复.
    • 这是我遇到的麻烦之一,获取对 MainPageViewModel 的引用,然后是 IBandOperator,因此我可以调用某种重置方法。我可以访问模板 10 使用的 ModalDialog,但除此之外找不到对 ViewModel 的引用。
    【解决方案2】:

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

    在使用调试位置的 Visual Studio 中,您随后可以Suspend and Shutdown 挂起您的应用,但会将其恢复状态从 PreviousExecutionState=Running 更改为 Terminated。在这种情况下,您的应用程序肯定不会仍在内存中,也肯定不会仍处于相同状态。它正在重新启动,并且模板 10 在此过渡期间启动,以恢复您的导航状态、设置和其他所有内容。它还将调用您的视图模型的 INav 覆盖,例如 NavTo 和 NavFrom。

    但要小心。 Bootstrapper 的 OnResuming 在此操作期间也会被调用。幸运的是,之前的状态被传递给了这个覆盖,你可以在你的调用代码中无缝地处理这个独特的情况。

    有意义吗?

    祝你好运。

    【讨论】:

    • 是的,我想我主要是通过大量调试和映射整个过程来了解它是如何工作的然后您可以在应用程序的应用程序/引导程序中利用 OnResuming 覆盖。根据您需要完成的任务,您可能需要通过全局静态事件公开此操作,以便您的视图模型可以以某种方式处理它。 除了 Web 开发之外的任何东西都非常绿色,这是我第一次真正尝试应用程序、Windows 10 和乐队同时学习很多东西.. :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多