如何登錄背景工作 (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;
}