在过去的几天里,我一直在用头撞显示器。我正在为 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 方法中不可用。快到了伙计们!!