Registrando uma tarefa em segundo plano no WinRT
-
21-12-2019 - |
Pergunta
Estou tentando registrar uma tarefa em segundo plano e estou tendo um comportamento estranho.Parece que a tarefa em si está sendo registrada e disparada na hora certa;no entanto, quando ele é acionado, meu programa está sendo encerrado (sem erros).
Suspeito que o motivo esteja relacionado ao fato de o programa não estar me perguntando se desejo permitir que uma tarefa em segundo plano seja executada quando eu iniciar.Criei uma declaração para a tarefa em segundo plano como um evento do sistema e estou registrando assim no 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();
Então, acredito que minha pergunta seja:por que ele não me pediria permissão para executar uma tarefa em segundo plano (que presumo que me dará a resposta para o meu principal problema de por que está travando)?
Não tenho certeza se isso importa, mas este é um aplicativo universal do Windows (o app.xaml.cs acima está no Shared
projeto.
A tarefa é assim:
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();
Solução
Você perguntou: por que não me pediu permissão para executar uma tarefa em segundo plano?
A resposta é: a menos que sua tarefa em segundo plano exija acesso à tela de bloqueio, ela não requer permissão do usuário para ser registrada.Não há prompt do usuário, por design.Uma das intenções deste design é permitir registrar uma tarefa de outra tarefa.
No Windows, você não precisa ligar BackgroundExecutionManager.RequestAccessAsync()
exceto para acesso à tela de bloqueio.Chamá-lo lhe dará mais cota, mas exigirá que o usuário aprove a tarefa.
No Windows Phone, ligar RequestAccessAsync()
é obrigatório, não importa o que aconteça, mas nunca solicita ao usuário uma interface do usuário.Por esse motivo, a lógica do seu aplicativo universal pode ser compartilhada, mas provavelmente terá um #if
tratar o registo de forma diferente, se for caso disso.