在 WinRT 中注册后台任务
-
21-12-2019 - |
题
我正在尝试注册后台任务,但出现了一些奇怪的行为。我看来任务本身正在正确的时间注册和触发;但是,当它确实触发时,它会关闭我的程序(没有错误)。
我怀疑原因与以下事实有关:程序没有询问我是我想在启动时允许后台任务运行。我已为后台任务创建了一个声明作为系统事件,并从 App.Xaml.cs 中进行如下注册:
var builder = new BackgroundTaskBuilder();
builder.Name = "NewTask";
builder.TaskEntryPoint = "ConnectionMonitor.CheckInternet";
builder.SetTrigger(new SystemTrigger(SystemTriggerType.InternetAvailable, false));
BackgroundTaskRegistration task = builder.Register();
所以,我相信我的问题是:为什么它不要求我运行后台任务的许可(我认为这会给我解决为什么崩溃的主要问题的答案)?
我不确定这是否重要,但这是一个 Windows 通用应用程序(上面的 app.xaml.cs 位于 Shared
项目。
任务如下所示:
BackgroundTaskDeferral _deferral = taskInstance.GetDeferral();
bool newConnected = IsConnected();
if (connected != newConnected)
{
connected = newConnected;
var notifier = ToastNotificationManager.CreateToastNotifier();
var template = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText02);
var element = template.GetElementsByTagName("text")[0];
element.AppendChild(template.CreateTextNode(connected ? "Connection available" : "Connection lost"));
var toast = new ToastNotification(template);
notifier.Show(toast);
}
_deferral.Complete();
解决方案
你问: 为什么它不询问我运行后台任务的权限?
答案是,除非你的后台任务需要锁屏访问,否则不需要用户的许可来注册。根据设计,没有用户提示。这种设计的目的之一是它允许您从另一个任务注册一个任务。
在 Windows 中,您不需要调用 BackgroundExecutionManager.RequestAccessAsync()
除了锁屏访问之外。调用它将为您提供更多配额,但需要用户批准该任务。
在 Windows Phone 中,拨打 RequestAccessAsync()
无论如何都是必需的,但永远不会通过 UI 提示用户。因此,您的通用应用程序中的逻辑可以共享,但可能会有一个 #if
以不同方式处理注册(如果相关)。
不隶属于 StackOverflow