Windows10 Dev - Thực thi nền
Nền tảng Windows chung (UWP) giới thiệu các cơ chế mới, cho phép ứng dụng thực hiện một số chức năng trong khi ứng dụng không chạy ở nền trước. UWP cũng tăng khả năng của các ứng dụng để kéo dài thời gian thực thi của chúng trong nềnBackground Tasks and Triggers. Thực thi nền là phần bổ sung thực sự cho vòng đời ứng dụng.
Các tính năng quan trọng của Nhiệm vụ nền là -
Một tác vụ nền được kích hoạt bởi hệ thống hoặc sự kiện thời gian và có thể bị ràng buộc bởi một hoặc nhiều điều kiện.
Khi một tác vụ nền được kích hoạt, trình xử lý liên quan của nó sẽ chạy và thực hiện công việc của tác vụ nền.
Tác vụ nền có thể chạy ngay cả khi ứng dụng đã đăng ký tác vụ nền bị tạm ngưng.
Chúng là một phần của nền tảng ứng dụng tiêu chuẩn và về cơ bản cung cấp một ứng dụng có khả năng đăng ký sự kiện hệ thống (trình kích hoạt). Khi sự kiện đó xảy ra, chúng sẽ chạy một khối mã được xác định trước trong nền. Kích hoạt hệ thống bao gồm các sự kiện như thay đổi trong kết nối mạng hoặc múi giờ hệ thống.
Thực thi nền không được đảm bảo, vì vậy nó không phù hợp với các chức năng và tính năng quan trọng.
Hệ điều hành có một giới hạn về số lượng tác vụ nền có thể chạy cùng một lúc. Vì vậy, ngay cả khi kích hoạt được kích hoạt và các điều kiện được đáp ứng, tác vụ vẫn không thể chạy.
Tạo và Đăng ký Nhiệm vụ Nền
Tạo một lớp tác vụ nền và đăng ký nó để chạy khi ứng dụng của bạn không ở nền trước. Bạn có thể chạy mã trong nền bằng cách viết các lớp triển khaiIBackgroundTaskgiao diện. Đoạn mã mẫu sau đây cho thấy một điểm bắt đầu rất cơ bản cho một lớp tác vụ nền.
public sealed class MyBackgroundTask : IBackgroundTask {
public void Run(IBackgroundTaskInstance taskInstance){
// write code
}
}
Bạn có thể yêu cầu quyền truy cập cho tác vụ nền như sau.
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;
}
Để xây dựng và đăng ký tác vụ nền, hãy sử dụng đoạn mã sau.
var task = new BackgroundTaskBuilder {
Name = "My Task",
TaskEntryPoint = typeof(BackgroundStuff.MyBackgroundTask).ToString()
};
var trigger = new ApplicationTrigger();
task.SetTrigger(trigger);
task.Register();
await trigger.RequestAsync();
Hãy để chúng tôi hiểu một ví dụ đơn giản về tác vụ nền bằng cách làm theo tất cả các bước dưới đây.
Tạo một dự án UWP trống mới ‘UWPBackgroundDemo’ và thêm một nút trong tệp 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>
Dưới đây là button click triển khai sự kiện trong đó nhiệm vụ nền được đăng ký.
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();
}
}
}
Bây giờ tạo một dự án khác, nhưng lần này chọn Thành phần thời gian chạy Windows (Universal Windows) từ menu và đặt tên Background stuff cho dự án này.
Dưới đây là mã C #. trong đó cóMyBackgroundTask cấy ghép lớp và nó sẽ chạy tác vụ nền.
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);
}
}
}
Để làm cho dự án này có thể truy cập được trong UWPBackgroundDemo dự án, nhấp chuột phải vào References > Add References trong Giải pháp Explorer và thêm BackgroundStuff dự án.
Bây giờ, chúng ta hãy đi đến Package.appxmanifest tập tin của UWPBackgroundDemo dự án và thêm thông tin sau vào tab Khai báo.
Đầu tiên hãy xây dựng dự án Nội dung nền, sau đó xây dựng và thực hiện UWPBackgroundDemo dự án.
Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ thấy cửa sổ sau.
Khi bạn nhấp vào button, nó sẽ chạy tác vụ nền và sẽ hiển thị thông báo ở cuối cửa sổ bên phải của bạn.