Windows10 Dev - execução em segundo plano

A Plataforma Universal do Windows (UWP) apresenta novos mecanismos, que permitem que os aplicativos executem algumas funcionalidades enquanto o aplicativo não está sendo executado em primeiro plano. UWP também aumenta a capacidade dos aplicativos de estender seu tempo de execução em segundo plano paraBackground Tasks and Triggers. A execução em segundo plano é a verdadeira cauda complementar do ciclo de vida do aplicativo.

As características importantes das tarefas em segundo plano são -

  • Uma tarefa em segundo plano é acionada por um sistema ou evento com registro de hora e pode ser restringida por uma ou mais condições.

  • Quando uma tarefa em segundo plano é disparada, seu manipulador associado é executado e realiza o trabalho da tarefa em segundo plano.

  • Uma tarefa em segundo plano pode ser executada mesmo quando o aplicativo que registrou a tarefa em segundo plano está suspenso.

  • Eles fazem parte da plataforma de aplicativo padrão e essencialmente fornecem um aplicativo com a capacidade de se registrar para um evento do sistema (gatilho). Quando esse evento ocorre, eles executam um bloco de código predefinido em segundo plano. Os gatilhos do sistema incluem eventos como mudanças na conectividade de rede ou fuso horário do sistema.

  • A execução em segundo plano não é garantida, portanto, não é adequada para funções e recursos críticos.

  • O sistema operacional tem uma limitação de quantas tarefas em segundo plano podem ser executadas ao mesmo tempo. Portanto, mesmo quando o gatilho é disparado e as condições são atendidas, a tarefa ainda não pode ser executada.

Criar e registrar tarefa em segundo plano

Crie uma classe de tarefa em segundo plano e registre-a para ser executada quando seu aplicativo não estiver em primeiro plano. Você pode executar o código em segundo plano, escrevendo classes que implementam oIBackgroundTaskinterface. O código de exemplo a seguir mostra um ponto de partida muito básico para uma classe de tarefa em segundo plano.

public sealed class MyBackgroundTask : IBackgroundTask { 
   public void Run(IBackgroundTaskInstance taskInstance){ 
      // write code 
   } 
}

Você pode solicitar acesso para tarefas em segundo plano da seguinte maneira.

var access = await BackgroundExecutionManager.RequestAccessAsync();
 
switch (access) {
 
   case BackgroundAccessStatus.Unspecified: 
      break; 
   case BackgroundAccessStatus.AllowedMayUseActiveRealTimeConnectivity: 
      break; 
   case BackgroundAccessStatus.AllowedWithAlwaysOnRealTimeConnectivity: 
      break; 
   case BackgroundAccessStatus.Denied: 
      break; 
   default: 
      break; 
}

Para construir e registrar a tarefa em segundo plano, use o código a seguir.

var task = new BackgroundTaskBuilder {
   Name = "My Task", 
   TaskEntryPoint = typeof(BackgroundStuff.MyBackgroundTask).ToString() 
}; 

var trigger = new ApplicationTrigger(); 
task.SetTrigger(trigger);  
task.Register(); 
 
await trigger.RequestAsync();

Vamos entender um exemplo simples de tarefa em segundo plano, seguindo todas as etapas fornecidas abaixo.

  • Crie um novo projeto UWP em branco ‘UWPBackgroundDemo’ e adicione um botão no arquivo XAML.

<Page 
   x:Class = "UWPBackgroundDemo.MainPage" 
   xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" 
   xmlns:local = "using:UWPBackgroundDemo" 
   xmlns:d = "http://schemas.microsoft.com/expression/blend/2008" 
   xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006" 
   mc:Ignorable = "d"> 
	
   <Grid Background = "{ThemeResource ApplicationPageBackgroundThemeBrush}">
      <Button x:Name = "button" Content = "Button" 
         HorizontalAlignment = "Left" Margin = "159,288,0,0" 
         VerticalAlignment = "Top" Click = "button_Click"/> 
   </Grid>
	
</Page>
  • Dado abaixo é o button click implementação de evento no qual a tarefa em segundo plano é registrada.

using System; 

using Windows.ApplicationModel.Background; 
using Windows.UI.Xaml; 
using Windows.UI.Xaml.Controls; 
 
// The Blank Page item template is documented at 
   http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409  

namespace UWPBackgroundDemo {
 
   /// <summary> 
      /// An empty page that can be used on its own or navigated to within a Frame. 
   /// </summary>
	
   public sealed partial class MainPage : Page {

      public MainPage() {
         this.InitializeComponent(); 
      }  
		
      private async void button_Click(object sender, RoutedEventArgs e) {
         var access = await BackgroundExecutionManager.RequestAccessAsync(); 
		 
         switch (access){ 
            case BackgroundAccessStatus.Unspecified: 
               break; 
            case BackgroundAccessStatus.AllowedMayUseActiveRealTimeConnectivity: 
               break; 
            case BackgroundAccessStatus.AllowedWithAlwaysOnRealTimeConnectivity: 
               break; 
            case BackgroundAccessStatus.Denied: 
               break; 
            default: 
               break; 
         } 
			
         var task = new BackgroundTaskBuilder {  
            Name = "My Task", 
            TaskEntryPoint = typeof(BackgroundStuff.MyBackgroundTask).ToString() 
         }; 
			
         var trigger = new ApplicationTrigger(); 
         task.SetTrigger(trigger);  
			
         var condition = new SystemCondition(SystemConditionType.InternetAvailable);  
         task.Register(); 
			
         await trigger.RequestAsync(); 
      } 
   } 
}
  • Agora crie outro projeto, mas desta vez selecione Windows Runtime Component (Universal Windows) no menu e dê o nome Background stuff a este projeto.

  • A seguir está o código C #. que contémMyBackgroundTask implantação da classe e executará a tarefa em segundo plano.

using Windows.ApplicationModel.Background; 
using Windows.UI.Notifications; 
 
namespace BackgroundStuff { 
   public sealed class MyBackgroundTask : IBackgroundTask { 
	
      public void Run(IBackgroundTaskInstance taskInstance) {
         SendToast("Hi this is background Task"); 
      } 
		
      public static void SendToast(string message) { 
         var template = ToastTemplateType.ToastText01; 
         var xml = ToastNotificationManager.GetTemplateContent(template); 
         var elements = xml.GetElementsByTagName("Test"); 
         var text = xml.CreateTextNode(message); 
			
         elements[0].AppendChild(text); 
         var toast = new ToastNotification(xml); 
         ToastNotificationManager.CreateToastNotifier().Show(toast); 
      } 
   } 
}
  • Para tornar este projeto acessível no UWPBackgroundDemo projeto, clique com o botão direito em References > Add References no Solution Explorer e adicione BackgroundStuff projeto.

  • Agora, vamos para o Package.appxmanifest arquivo de UWPBackgroundDemo projeto e adicione as seguintes informações na guia Declarações.

  • Primeiro construa o projeto Background stuff, em seguida, construa e execute o UWPBackgroundDemo projeto.

  • Quando o código acima for compilado e executado, você verá a seguinte janela.

  • Quando você clica no button, ele executará a tarefa em segundo plano e mostrará uma notificação na extremidade direita da janela.