建立及註冊同處理序的背景工作

重要 API

本主題示範如何建立和註冊與您的應用程式在同一程序中執行的背景任務。

跨程序背景工作比跨程序背景工作更容易實作。 不過,它們較不具復原性。 如果程序內背景工作中執行的程式代碼當機,則會關閉您的應用程式。 另請注意,DeviceUseTriggerDeviceServicingTriggerIoTStartupTask 無法與同程序模型搭配使用。 您也無法在應用程式中啟用 VoIP 背景工作。 這些觸發程式和工作仍然支援使用跨程序背景工作模型。

請注意,即使背景活動在應用程式的前景程序內執行,如果執行超過運行時間限制,仍可終止。 針對某些用途,將工作分成在個別程序中執行的背景工作復原仍然很有用。 將背景工作作為與前景應用程式分開的工作,可能是不需要與前景應用程式通訊之工作的最佳選項。

基礎概念

同程序模型會使用改善應用程式在前景或背景中的通知,來增強應用程式生命週期。 這些轉換可從 Application 物件取得兩個新的事件:EnteredBackgroundLeavingBackground 這些事件會根據應用程式的可見度狀態納入應用程式生命週期,深入瞭解這些事件,以及它們如何影響應用程式生命週期的應用程式生命週期

概括而言,您將會處理 EnteredBackground 事件,以執行將在應用程式在背景執行時執行的程式碼,並處理 LeavingBackground,以了解您的應用程式何時移至前景。

註冊背景工作觸發程式

同程序背景活動會註冊與跨程序背景活動大致相同。 所有背景觸發程式都會使用 BackgroundTaskBuilder 開始註冊。 建構器可讓您輕鬆地註冊背景工作,方法是在單一位置設定所有必要的值:

var builder = new BackgroundTaskBuilder();
builder.Name = "My Background Trigger";
builder.SetTrigger(new TimeTrigger(15, true));
// Do not set builder.TaskEntryPoint for in-process background tasks
// Here we register the task and work will start based on the time trigger.
BackgroundTaskRegistration task = builder.Register();

注意

通用 Windows 平台應用程式註冊任何背景觸發程序類型之前,必須呼叫 RequestAccessAsync。 為了確保通用 Windows 應用程式在您發行應用程式更新之後繼續正常執行,您必須呼叫 RemoveAccess,然後在應用程式更新後啟動時呼叫 RequestAccessAsync。 如需詳細資訊,請參閱背景任務指南

對於不設定的程序內背景活動,TaskEntryPoint.將其留空會啟用預設入口點,即 Application 物件上名為 OnBackgroundActivated() 的新受保護方法。

註冊觸發程式之後,它會根據 SetTrigger 方法中的觸發程式集類型引發。 在上面的範例中,使用了 TimeTrigger,它將在註冊後十五分鐘內觸發。

新增條件來控制任務何時運作 (可選)

您可以新增條件來控制工作在觸發程式事件發生後執行的時間。 例如,如果您不希望任務在使用者存在之前執行,請使用條件 UserPresent。 如需可能條件的清單,請參閱 SystemConditionType

下列範例程式代碼會指派條件,要求使用者存在:

builder.AddCondition(new SystemCondition(SystemConditionType.UserPresent));

將您的背景活動程式代碼放在 OnBackgroundActivated()

將您的背景活動程序代碼放在 OnBackgroundActivated 中,以在引發背景觸發程式時回應。 OnBackgroundActivated 可以像 IBackgroundTask.Run 一樣處理。 方法具有 BackgroundActivatedEventArgs 參數,其中包含 Run 方法所傳遞的所有專案。 例如,在 App.xaml.cs:

using Windows.ApplicationModel.Background;

...

sealed partial class App : Application
{
  ...

  protected override void OnBackgroundActivated(BackgroundActivatedEventArgs args)
  {
      base.OnBackgroundActivated(args);
      IBackgroundTaskInstance taskInstance = args.TaskInstance;
      DoYourBackgroundWork(taskInstance);  
  }
}

如需更豐富的 OnBackgroundActivated 範例,請參閱 將應用程式服務轉換為在其主應用程式相同的程序中執行。

處理背景任務進度和完成狀況+

工作進度和完成可以監視與多程序背景工作相同 (請參閱監視背景工作進度和完成),但您可能會發現,您可以使用變數來追蹤應用程式中的進度或完成狀態,以更輕鬆地追蹤它們。 這是讓背景活動程序代碼在與應用程式相同的程序中執行的優點之一。

處理背景任務取消

同程序背景工作取消的方式與跨程序背景工作相同 (請參閱處理已取消的背景工作)。 請注意,您的 BackgroundActivated 事件處理程式必須在取消發生之前結束,否則整個程序將會終止。 如果您取消背景工作時前景應用程式意外關閉,請確認處理程式在取消發生之前已結束。

資訊清單

不同於跨程序背景工作,您不需要將背景工作資訊新增至封裝指令清單,才能執行程序內背景工作。

摘要和後續步驟

您現在應該瞭解如何撰寫跨程序背景工作的基本概念。

如需 API 參考、背景工作概念指引,以及撰寫使用背景工作之應用程式的詳細指示,請參閱下列相關主題。

詳細的背景工作指示性主題

背景工作指引

背景工作 API 參考