Language: HTML | XAML

快速入門:建立和登錄原始通知背景工作 (XAML)

Applies to Windows and Windows Phone

附註  不是使用 C#/VB/C++?請參閱快速入門:建立和登錄原始通知背景工作 (HTML)

您可以為 Windows 市集應用程式建立並登錄背景工作功能。這個程式碼會在收到原始通知時執行以做為回應,讓應用程式即使不在前景執行,也能具備功能。

若要完成這個程序,您必須編輯三個不同的檔案:應用程式的程式碼、應用程式的資訊清單,以及包含背景工作程式碼的新檔案。

先決條件

若要了解這個主題或使用這個主題提供的程式碼,您需要:

  • 熟悉推播通知。如需詳細資訊,請參閱推播通知概觀
  • 熟悉原始推播通知。如需詳細資訊,請參閱原始通知概觀
  • 能夠將推播通知傳送到 Windows 推播通知服務 (WNS) 的雲端服務。如需詳細資訊,請參閱快速入門:傳送推播通知
  • 背景工作的上層應用程式。這個應用程式必須具備可在鎖定畫面上顯示的權限。如需詳細資訊,請參閱鎖定畫面概觀

指示

1. 建立背景工作類別

若要在背景執行程式碼,您必須建立實作 IBackgroundTask 介面的類別,如下列範例所示。這個類別會在傳遞原始通知時執行。

一開始請在應用程式的方案中建立新專案。這個專案將包含您的背景工作程式碼。將 Windows.ApplicationModel.Background 命名空間匯入專案。將程式碼檔案新增到該專案。在這個案例中,我們將新增名為 ExampleBackgroundTask.cs 的 C# 檔案。

ExampleBackgroundTask.cs 檔案中,建立實作 IBackgroundTask 介面的新類別。該介面的 Run 方法必須在每個背景工作中顯示為進入點,以便在觸發特定事件時呼叫。

下列範例說明一個非常基本的背景工作類別起點。應用程式定義之原始通知內容特定的程式碼內文將取代 "// ..." 註解。



using Windows.ApplicationModel.Background;
using Windows.Networking.PushNotifications;

namespace Tasks
{
    public sealed class ExampleBackgroundTask : IBackgroundTask
    {
        public void Run(IBackgroundTaskInstance taskInstance)
        {
            RawNotification notification = (RawNotification)taskInstance.TriggerDetails;
            string content = notification.Content;

            // ...
        }        
    }
}

如果您在背景工作中執行任何非同步程式碼,則您的背景工作需要使用 deferral。若沒有延遲,如果 Run 方法在您的非同步方法之前完成,則背景工作處理程序便會以未預期的方式終止。

在您呼叫非同步方法之前,請在 Run 方法中呼叫延遲。將延遲儲存為全域變數,如此便能從非同步方法存取它。在非同步方法完成之後宣告延遲完成。下列程式碼使用名為 ExampleMethodAsync 的非同步方法示範這些步驟。在背景執行工作的程式碼將取代 "// ..." 註解。

附註  在 C# 中,可以使用 "async" 或 "await" 關鍵字呼叫背景工作的非同步方法。在 C++ 中,可以使用工作鏈結達成類似的結果。

如需 Windows 市集應用程式中非同步模式的詳細資訊,請參閱非同步程式設計。如需使用延遲防止背景工作在預期時間之前終止的其他範例,請參閱背景工作範例



public async void Run(IBackgroundTaskInstance taskInstance)
{
    BackgroundTaskDeferral _deferral = taskInstance.GetDeferral();
    
    RawNotification notification = (RawNotification)taskInstance.TriggerDetails;
    string content = notification.Content;

    // ...

    // Insert code to start one or more asynchronous methods using the "await" keyword.
    var result = await ExampleMethodAsync();
    
    // ...
    
    _deferral.Complete();
}

2. 在應用程式資訊清單中宣告背景工作

附註  這個步驟的先決條件是,您的應用程式必須選擇一個鎖定畫面選項,並提供徽章標誌,才能支援背景工作。如需詳細資訊,請參閱快速入門:在鎖定畫面上顯示磚更新與徽章更新

您必須先在應用程式資訊清單中宣告背景工作及其觸發程序,應用程式才能登錄該背景工作。這可以直接以 XML 完成,或者透過 Microsoft Visual Studio 資訊清單編輯器完成。

  • 若要使用資訊清單編輯器,請在 Visual Studio 中按兩下應用程式的 Package.appxmanifest 檔案。在 [宣告] 索引標籤上,從 [可用宣告] 下拉式清單中選擇 [背景工作]。做為觸發程序,請選擇 [屬性] 下方的 [推播通知]。在 [起始頁] 方塊中,輸入背景工作檔案的名稱,在我們的案例中為 ExampleBackgroundTask.cs

    如果您的應用程式使用一個以上的背景工作,請針對每個工作重複執行這個步驟,每次都指向不同的檔案。

  • 若要將資訊直接新增到資訊清單的 XML,請在文字編輯器中開啟該資訊清單。在 Extensions 元素中,為背景工作類別新增 Extension 元素。Category 屬性應該設定為 "windows.backgroundTasks",而 StartPage 屬性應該為背景工作的檔案命名,在我們的案例中為 ExampleBackgroundTask.cs

    如果您的應用程式使用一個以上的背景工作,請針對每個工作新增個別的 Extension 元素,每個元素都要指向不同的檔案。

    您必須列出背景工作所使用的每個觸發程序類型。由於我們正在建立要在回應原始通知時觸發的背景工作,因此將宣告推播通知觸發程序。將 BackgroundTasks 元素新增到 Extension 元素,並將它的 Task 元素設定為 "pushNotification"。

    這裡顯示完整的 Extension 元素。



<Extension Category="windows.backgroundTasks" StartPage="js\examplebackgroundtask.js">
  <BackgroundTasks>
    <Task Type="pushNotification"/>
  </BackgroundTasks>
</Extension>

3. 在應用程式中登錄背景工作

您要將下列範例提供的程式碼新增到應用程式 (例如,在它的 MainPage.xaml.cs file),以便將背景工作登錄為原始通知的回應。

附註  您也可以建立專門用來登錄背景工作的函式。如需詳細資訊,請參閱如何登錄背景工作。在這種情況下,您不需要使用以下這些步驟,只需建構觸發程序,並將它和工作名稱、工作進入點及 (選用) 條件提供給登錄函式即可。

首先,判斷背景工作是否已登錄。這個步驟很重要。如果您的應用程式不會檢查現有背景工作登錄,則可以多次登錄相同的工作。這樣可能會發生讓工作無法完成的效能問題和 CPU 使用率。

這個範例會逐一查看 Windows.ApplicationModel.Background.BackgroundTaskRegistration.AllTasks 屬性,並在工作已經登錄時,將旗標設為 true



var taskRegistered = false;
var exampleTaskName = "ExampleBackgroundTask";

var iter = Windows.ApplicationModel.Background.BackgroundTaskRegistration.AllTasks.first();

while (iter.hasCurrent) {
    var task = iter.current.value;
    
    if (task.name == exampleTaskName) {
        taskRegistered = true;
        break;
    }

    iter.moveNext();
}

如果您的應用程式發現背景工作尚未登錄,可以呼叫 Windows.ApplicationModel.Background.BackgroundTaskBuilder.Register 方法來登錄它。您會在對這個方法的呼叫中包含工作的進入點,這是您的背景工作類別名稱,首碼為命名空間。

背景工作觸發程序會控制背景工作何時執行。在這個案例中,透過使用 PushNotificationTrigger,會在原始通知傳遞到推播通知通道時觸發。



if (!taskRegistered) {

var builder = new BackgroundTaskBuilder();

builder.Name = exampleTaskName;
builder.TaskEntryPoint = "Task.ExampleBackgroundTask";
builder.SetTrigger(new Windows.ApplicationModel.Background.PushNotificationTrigger());
BackgroundTaskRegistration task = builder.Register();
}

摘要

您現在應該了解撰寫背景工作類別與原始通知搭配使用的基本知識,其中包含如何從應用程式內登錄背景工作。您也應該了解如何更新應用程式資訊清單,Windows 才能讓應用程式登錄它的背景工作。

附註  您可以下載背景工作範例,在使用數種不同背景工作類型的完整、可靠 Windows 市集應用程式內容中查看這些程式碼範例及更多內容。

相關主題

原始通知範例
原始通知概觀
原始通知的指導方針和檢查清單
快速入門:攔截執行中應用程式的推播通知
RawNotification

 

 

顯示:
© 2014 Microsoft