Windows 10 開發 - 後臺執行



通用 Windows 平臺 (UWP) 引入了新的機制,允許應用程式在應用程式未在前臺執行時執行某些功能。UWP 還增強了應用程式在後臺擴充套件其執行時間的能力,例如 **後臺任務和觸發器**。後臺執行是應用程式生命週期的真正補充部分。

後臺任務的重要特性如下:

  • 後臺任務由系統或時間事件觸發,並且可以受到一個或多個條件的限制。

  • 當後臺任務被觸發時,其關聯的處理程式執行並執行後臺任務的工作。

  • 即使註冊了後臺任務的應用處於掛起狀態,後臺任務也可以執行。

  • 它們是標準應用程式平臺的一部分,本質上為應用程式提供了註冊系統事件(觸發器)的能力。當該事件發生時,它們在後臺執行預定義的程式碼塊。系統觸發器包括網路連線更改或系統時區等事件。

  • 後臺執行並非得到保證,因此不適用於關鍵功能和特性。

  • 作業系統對同時執行的後臺任務數量有限制。因此,即使觸發器被觸發並且條件滿足,任務仍然可能無法執行。

建立和註冊後臺任務

建立一個後臺任務類並將其註冊為在您的應用不在前臺時執行。您可以透過編寫實現 **IBackgroundTask** 介面的類來在後臺執行程式碼。以下示例程式碼展示了一個非常基本的後臺任務類的起點。

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

您可以按如下方式請求後臺任務的訪問許可權。

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);  
task.Register(); 
 
await trigger.RequestAsync();

讓我們透過以下所有步驟瞭解一個簡單的後臺任務示例。

  • 建立一個新的空白 UWP 專案 **“UWPBackgroundDemo”**,並在 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>
  • 以下是 **按鈕點選** 事件的實現,其中註冊了後臺任務。

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(); 
      } 
   } 
} 
  • 現在建立一個新的專案,但這次從選單中選擇 Windows 執行時元件(通用 Windows),併為該專案命名為 **Background stuff**。

Background stuff
  • 以下是 C# 程式碼,其中包含 **MyBackgroundTask** 類實現,它將執行後臺任務。

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); 
      } 
   } 
}
  • 為了使該專案在 **UWPBackgroundDemo** 專案中可用,請在解決方案資源管理器中右鍵單擊 **引用 > 新增引用**,並新增 **BackgroundStuff** 專案。

Background stuff Sec
  • 現在,讓我們轉到 **UWPBackgroundDemo** 專案的 **Package.appxmanifest** 檔案,並在“宣告”選項卡中新增以下資訊。

Background stuff
  • 首先構建 Background stuff 專案,然後構建並執行 **UWPBackgroundDemo** 專案。

  • 當以上程式碼編譯並執行時,您將看到以下視窗。

Background stuff
  • 當您單擊 **按鈕** 時,它將執行後臺任務,並在視窗的右側顯示通知。

廣告

© . All rights reserved.