0

在过去的几天里,我一直在用头撞显示器。我正在为 Windows Store 开发一个 UWP 应用程序(针对 14393),并且我正在为 MVVM / IoC 使用 Prism/Unity 框架。

由于更新 Live Tile 所需的数据存储在实现 Repository 模式的类中,并且一切都通过 Unity 进行管理,因此我没有为后台执行创建单独的进程,因此甚至简化了整个 BGTask 注册过程。

实际的BGTask注册码如下:

var servicingTaskAlreadyRegistered = false;
var tileUpdaterTaskAlreadyRegistered = false;

foreach (var t in BackgroundTaskRegistration.AllTasks)
{
    if (t.Value.Name == Constants.BgTileUpdaterTaskName)
        tileUpdaterTaskAlreadyRegistered = true;
    else if (t.Value.Name.Equals(Constants.BgServicingTaskName))
        servicingTaskAlreadyRegistered = true;
}

var reqAccess = await BackgroundExecutionManager.RequestAccessAsync();
if (reqAccess == BackgroundAccessStatus.Denied ||
    reqAccess == BackgroundAccessStatus.DeniedBySystemPolicy ||
    reqAccess == BackgroundAccessStatus.DeniedByUser ||
    reqAccess == BackgroundAccessStatus.Unspecified)
    return false;

if (!servicingTaskAlreadyRegistered)
{
    var servicingTaskBuilder = new BackgroundTaskBuilder();
    servicingTaskBuilder.Name = Constants.BgServicingTaskName;
    servicingTaskBuilder.SetTrigger(new SystemTrigger(SystemTriggerType.ServicingComplete, false));
    servicingTaskBuilder.Register();
}

if (tileUpdaterTaskAlreadyRegistered)
    return true;

var builder = new BackgroundTaskBuilder();
builder.Name = Constants.BgTileUpdaterTaskName;
builder.SetTrigger(new TimeTrigger(TileUpdateFrequencyMinutes, false));
//builder.SetTrigger(new MaintenanceTrigger(TileUpdateFrequencyMinutes, false));
builder.IsNetworkRequested = true;

builder.Register();

注册成功完成。在 PowerShell 中执行 Get-AppBackgroundTask 会显示这两个任务,因为它应该是。但是,TimeTrigger 永远不会触发。将 TimeTrigger 与 MaintenanceTrigger 交换可以解决问题,尽管智能手机需要插入充电器,这不是可接受的解决方法。

强制任务通过 VisualStudio 或 PowerShell (Start-AppBackgroundTask -TaskID) 正确执行并更新磁贴。

您还有其他有用的提示要分享吗?

编辑 2017 年 12 月1 日 我创建了一个 Repro,其中包含一个带有两个项目的 Visual Studio 解决方案:

  • 动态磁贴测试简单:使用 UWP 每 15 分钟更新一次动态磁贴非常简单。一切都按预期工作。
  • Live Tile Test Prism:再次,使用 Prism 和 Unity 对上述项目进行简单转换。不起作用,因为当操作系统尝试启动应用程序以更新磁贴时,Unity 容器为空(未初始化)。

这解释了我遇到问题的原因:Unity 没有初始化,我无法通过存储库检索数据,应用程序崩溃和 GG。

现在我只需要了解为什么 Unity 在 OnBackgroundActivated 方法中不可用。快到了伙计们!!

复制:https ://github.com/eraser85/LiveTileTestRepro

4

2 回答 2

0

代码对我来说看起来不错,我在这里尝试更改的唯一内容是IsNetwokRequested属性的使用和TimeTrigger频率值,您确定您使用的常量/变量大于或等于 15?

这是一个示例:

BackgroundTaskBuilder builder = new BackgroundTaskBuilder { Name = "YourBgTaskName" };
builder.SetTrigger(new TimeTrigger(15, false));
builder.AddCondition(new SystemCondition(SystemConditionType.InternetAvailable));
builder.Register();
于 2017-01-11T18:00:01.687 回答
0

好的,经过更多的测试,我终于想出了一个解决方案。

如前所述,问题源于 Prism:基本上,当由操作系统启动并通过OnBackgroundActivated()IoC 容器进入时,并没有被初始化。

该解决方案,即使看起来像 hack-ish,实际上是完全可行和正确的(恕我直言!)。在您OnBackgroundActivated()刚刚初始化所有内容时,就好像从头开始一样(请查看Prism 的 Source以了解实现细节):在我的具体情况下,我只是调用CreateAndConfigureContainer()并重新注册了我放入的所有内容OnInitializeAsync()(例如 repos、services..)。

我已经向开发人员提出了一个问题。也许解决方案已经在路上了,但与此同时应该这样做。

于 2017-01-16T21:50:15.937 回答