Windows10 Dev - Esecuzione in background

La piattaforma UWP (Universal Windows Platform) introduce nuovi meccanismi che consentono alle applicazioni di eseguire alcune funzionalità mentre l'applicazione non è in esecuzione in primo piano. UWP aumenta anche la capacità delle applicazioni di estendere il tempo di esecuzione in background perBackground Tasks and Triggers. L'esecuzione in background è la vera coda complementare al ciclo di vita dell'applicazione.

Le caratteristiche importanti delle attività in background sono:

  • Un'attività in background viene attivata da un evento di sistema o temporale e può essere vincolata da una o più condizioni.

  • Quando viene attivata un'attività in background, il gestore associato viene eseguito ed esegue il lavoro dell'attività in background.

  • Un'attività in background può essere eseguita anche quando l'app che ha registrato l'attività in background è sospesa.

  • Fanno parte della piattaforma applicativa standard e essenzialmente forniscono un'app con la possibilità di registrarsi per un evento di sistema (trigger). Quando si verifica quell'evento, eseguono un blocco di codice predefinito in background. I trigger di sistema includono eventi quali modifiche alla connettività di rete o al fuso orario del sistema.

  • L'esecuzione in background non è garantita, quindi non è adatta per funzioni e caratteristiche critiche.

  • Il sistema operativo ha una limitazione sul numero di attività in background che possono essere eseguite contemporaneamente. Pertanto, anche quando il trigger viene attivato e le condizioni sono soddisfatte, l'attività non può comunque essere eseguita.

Crea e registra attività in background

Crea una classe di attività in background e registrala per l'esecuzione quando l'app non è in primo piano. È possibile eseguire codice in background scrivendo classi che implementano ilIBackgroundTaskinterfaccia. Il codice di esempio seguente mostra un punto di partenza molto semplice per una classe di attività in background.

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

È possibile richiedere l'accesso per l'attività in background come segue.

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; 
}

Per creare e registrare l'attività in background, utilizzare il codice seguente.

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

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

Cerchiamo di capire un semplice esempio di attività in background seguendo tutti i passaggi indicati di seguito.

  • Crea un nuovo progetto UWP vuoto ‘UWPBackgroundDemo’ e aggiungi un pulsante nel file 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>
  • Di seguito è riportato il file button click implementazione dell'evento in cui viene registrata l'attività in background.

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(); 
      } 
   } 
}
  • Ora crea un altro progetto, ma questa volta seleziona Windows Runtime Component (Universal Windows) dal menu e dai il nome Background stuff a questo progetto.

  • Di seguito è riportato il codice C #. che contieneMyBackgroundTask impianto di classe ed eseguirà l'attività in background.

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); 
      } 
   } 
}
  • Per rendere questo progetto accessibile in UWPBackgroundDemo progetto, fare clic con il tasto destro su References > Add References in Esplora soluzioni e aggiungi BackgroundStuff progetto.

  • Ora, andiamo al Package.appxmanifest file di UWPBackgroundDemo progetto e aggiungere le seguenti informazioni nella scheda Dichiarazioni.

  • Per prima cosa crea il progetto Background stuff, quindi crea ed esegui il file UWPBackgroundDemo progetto.

  • Quando il codice sopra è stato compilato ed eseguito, vedrai la seguente finestra.

  • Quando fai clic sul file button, eseguirà l'attività in background e mostrerà una notifica all'estremità destra della finestra.