Windows10 Dev - wykonywanie w tle
Platforma Universal Windows Platform (UWP) wprowadza nowe mechanizmy, które pozwalają aplikacjom wykonywać pewne funkcje, gdy aplikacja nie jest uruchomiona na pierwszym planie. Platforma UWP zwiększa również zdolność aplikacji do wydłużania czasu wykonywania w tle dla platformyBackground Tasks and Triggers. Wykonywanie w tle jest prawdziwym, uzupełniającym ogonem cyklu życia aplikacji.
Ważnymi cechami zadań w tle są -
Zadanie w tle jest wyzwalane przez zdarzenie systemowe lub czasowe i może być ograniczone przez jeden lub więcej warunków.
Po wyzwoleniu zadania w tle skojarzony z nim program obsługi uruchamia się i wykonuje zadanie w tle.
Zadanie w tle może działać nawet wtedy, gdy aplikacja, która zarejestrowała zadanie w tle, jest zawieszona.
Stanowią one część standardowej platformy aplikacji i zasadniczo zapewniają aplikacji możliwość rejestracji na zdarzenie systemowe (wyzwalacz). Kiedy to zdarzenie ma miejsce, uruchamiają w tle predefiniowany blok kodu. Wyzwalacze systemowe obejmują zdarzenia, takie jak zmiany w łączności sieciowej lub systemowej strefie czasowej.
Wykonywanie w tle nie jest gwarantowane, więc nie nadaje się do krytycznych funkcji i funkcji.
System operacyjny ma ograniczenie co do liczby zadań w tle, które można uruchomić w tym samym czasie. Dlatego nawet po uruchomieniu wyzwalacza i spełnieniu warunków zadanie nadal nie może zostać uruchomione.
Utwórz i zarejestruj zadanie w tle
Utwórz klasę zadań w tle i zarejestruj ją, aby była uruchamiana, gdy aplikacja nie znajduje się na pierwszym planie. Możesz uruchomić kod w tle, pisząc klasy, które implementująIBackgroundTaskberło. Poniższy przykładowy kod przedstawia bardzo podstawowy punkt wyjścia dla klasy zadań w tle.
public sealed class MyBackgroundTask : IBackgroundTask {
public void Run(IBackgroundTaskInstance taskInstance){
// write code
}
}
Możesz zażądać dostępu do zadania w tle w następujący sposób.
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;
}
Aby skompilować i zarejestrować zadanie w tle, użyj następującego kodu.
var task = new BackgroundTaskBuilder {
Name = "My Task",
TaskEntryPoint = typeof(BackgroundStuff.MyBackgroundTask).ToString()
};
var trigger = new ApplicationTrigger();
task.SetTrigger(trigger);
task.Register();
await trigger.RequestAsync();
Zrozummy prosty przykład zadania w tle, wykonując wszystkie poniższe kroki.
Utwórz nowy pusty projekt platformy UWP ‘UWPBackgroundDemo’ i dodaj jeden przycisk w pliku 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>
Podano poniżej button click implementacja zdarzenia, w której rejestrowane jest zadanie w tle.
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();
}
}
}
Teraz stwórz kolejny projekt, ale tym razem wybierz z menu składnik Windows Runtime Component (Universal Windows) i podaj nazwę Background stuff do tego projektu.
Poniżej podano kod C #. który zawieraMyBackgroundTask klasy implantacji i uruchomi zadanie w tle.
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);
}
}
}
Aby udostępnić ten projekt w UWPBackgroundDemo projekt, kliknij prawym przyciskiem myszy References > Add References w Eksploratorze rozwiązań i dodaj BackgroundStuff projekt.
Teraz przejdźmy do Package.appxmanifest plik z UWPBackgroundDemo projekt i dodaj następujące informacje na karcie Deklaracje.
Najpierw skompiluj projekt w tle, a następnie skompiluj i wykonaj UWPBackgroundDemo projekt.
Kiedy powyższy kod zostanie skompilowany i wykonany, zobaczysz następujące okno.
Po kliknięciu button, uruchomi zadanie w tle i wyświetli powiadomienie na prawym końcu okna.