如何登錄背景工作 (HTML)

[ 本文的目標對象是撰寫 Windows 執行階段 App 的 Windows 8.x 和 Windows Phone 8.x 開發人員。如果您正在開發適用於 Windows 10 的 App,請參閱 最新文件 ]

了解如何建立可重複用來安全登錄大多數背景工作的函式。 這個主題會逐步解說可登錄背景工作的公用程式函式。這個公用程式函式會先檢查現有登錄,以避免多次登錄工作時可能產生的問題;也可以將系統條件套用到背景工作。本逐步解說包括這個公用程式函式的完整工作範例。

注意  

就「Windows Phone 市集」應用程式而言,在嘗試登錄任何背景工作之前,您都必須先呼叫 RequestAccessAsync。在 Windows 上,只有當一組背景工作需要應用程式在鎖定畫面上才能執行時,才需要進行這個呼叫,但是在 Windows Phone 上,登錄任何背景工作之前,都必須先呼叫一次這個方法。

為了確保您的 Windows Phone 應用程式會在您發行更新之後繼續正常執行,您必須呼叫 RemoveAccess,然後在應用程式於更新後啟動時呼叫 RequestAccessAsync。如需詳細資訊,請參閱背景工作的指導方針 (HTML)

您必須知道的事

技術

先決條件

  • 這個主題假設您已經有需要登錄的背景工作 (這個主題不會討論如何編寫背景工作)。

指示

步驟 1: 定義函式簽章

這個函式採用背景工作的工作進入點、工作名稱、預先建構的背景工作觸發程序,以及 (選用) SystemCondition。請注意,這個函式會傳回 BackgroundTaskRegistration 物件。

function RegisterBackgroundTask(taskEntryPoint, 
                                taskName,
                                trigger,
                                condition)
{
    
    // We’ll add code to this function in subsequent steps.

}

步驟 2: 檢查現有登錄

檢查工作是否已登錄。這是檢查的重點,因為如果多次登錄工作,則觸發該工作時,它就會多次執行;這樣可能會過量使用 CPU 配額,也可能造成未預期的行為。

您可以查詢 BackgroundTaskRegistration.AllTasks 屬性並逐一查看結果,以檢查現有登錄。檢查每個執行個體的名稱 - 如果它符合您要登錄的工作名稱,則中斷迴圈並設定旗標變數,讓您的程式碼能夠在下一個步驟中選擇不同路徑。

注意  使用您應用程式專用的背景工作名稱。確認每個背景工作都有唯一的名稱。

 

下列程式碼會使用我們在上一個步驟中建立的 SystemTrigger 來登錄背景工作:

function RegisterBackgroundTask(taskEntryPoint, 
                                taskName,
                                trigger,
                                condition)
{
    //
    // Check for existing registrations of this background task.
    //

    var taskRegistered = false;

    var background = Windows.ApplicationModel.Background;
    var iter = background.BackgroundTaskRegistration.allTasks.first();
    var hascur = iter.hasCurrent;

    while (hascur) {
        var cur = iter.current.value;

        if (cur.name === taskName) {
            taskRegistered = true;
            break;
        }
        
        hascur = iter.moveNext();
    }


    // We’ll register the task in the next step.

}

步驟 3: 登錄背景工作 (或傳回現有登錄)

檢查現有背景工作登錄清單中是否已有該工作。如果有,則傳回工作的該執行個體。

然後使用新的 BackgroundTaskBuilder 物件登錄工作。這段程式碼應該會檢查條件參數是否為 Null;如果不是,則將條件新增到登錄物件。傳回由 BackgroundTaskBuilder.Register 函式傳回的 BackgroundTaskRegistration

注意  

從 Windows 8.1 開始,背景工作登錄參數都是在登錄時驗證。如果有任一個登錄參數無效,就會傳回錯誤。您的應用程式必須能夠處理背景工作登錄失敗的狀況,例如使用條件式陳述式來檢查登錄是否有錯誤,接著使用不同的參數值來重試已失敗的登錄。

 

下列範例會傳回現有工作,或新增可登錄背景工作的程式碼 (如果有選擇性的系統條件,則也包括在內):

function RegisterBackgroundTask(taskEntryPoint, 
                                taskName,
                                trigger,
                                condition)
{
    //
    // Check for existing registrations of this background task.
    //

    var taskRegistered = false;

    var background = Windows.ApplicationModel.Background;
    var iter = background.BackgroundTaskRegistration.allTasks.first();
    var hascur = iter.hasCurrent;

    while (hascur) {
        var cur = iter.current.value;

        if (cur.name === taskName) {
            taskRegistered = true;
            break;
        }
        
        hascur = iter.moveNext();
    }


    //
    // If the task is already registered, return the registration object.
    //

    if (taskRegistered == true) {
        
        return iter.current;
    }


    //
    // Register the background task.
    //
    var builder = new background.BackgroundTaskBuilder();

    builder.Name = taskName;
    builder.TaskEntryPoint = taskEntryPoint;
    builder.setTrigger(trigger);

    if (condition != null) {

        builder.addCondition(condition);
    }

    var task = builder.register();

    return task;
}

完成背景工作登錄公用程式函式

這個範例顯示已完成的背景工作登錄函式。這個函式可用來登錄大多數的背景工作 (除了網路背景工作之外)。

//
// Register a background task with the specified taskEntryPoint, name, trigger,
// and condition (optional).
//
// taskEntryPoint: Task entry point for the background task.
// taskName: A name for the background task.
// trigger: The trigger for the background task.
// condition: Optional parameter. A conditional event that must be true for the task to fire.
//
function RegisterBackgroundTask(taskEntryPoint, 
                                taskName,
                                trigger,
                                condition)
{
    //
    // Check for existing registrations of this background task.
    //

    var taskRegistered = false;

    var background = Windows.ApplicationModel.Background;
    var iter = background.BackgroundTaskRegistration.allTasks.first();
    var hascur = iter.hasCurrent;

    while (hascur) {
        var cur = iter.current.value;

        if (cur.name === taskName) {
            taskRegistered = true;
            break;
        }
        
        hascur = iter.moveNext();
    }


    //
    // If the task is already registered, return the registration object.
    //

    if (taskRegistered == true) {
        
        return iter.current;
    }


    //
    // Register the background task.
    //
    var builder = new background.BackgroundTaskBuilder();

    builder.Name = taskName;
    builder.TaskEntryPoint = taskEntryPoint;
    builder.setTrigger(trigger);

    if (condition != null) {

        builder.addCondition(condition);
    }

    var task = builder.register();

    return task;
}

相關主題

快速入門:建立並登錄背景工作

如何使用背景工作回應系統事件

如何設定執行背景工作的條件

如何使用維護觸發程序

如何處理已取消的背景工作

如何監視背景工作進度和完成

如何在計時器上執行背景工作

如何偵錯背景工作

如何在 Windows 市集 app 觸發暫停、繼續以及背景事件 (偵錯時)