取り消されたバックグラウンド タスクを処理する方法 (HTML)
[ この記事は、Windows ランタイム アプリを作成する Windows 8.x および Windows Phone 8.x 開発者を対象としています。Windows 10 向けの開発を行っている場合は、「最新のドキュメント」をご覧ください]
取り消し要求を認識し、作業を停止して、バックグラウンド タスク インスタンスと固定ストレージを使っているアプリの取り消しを報告するバックグラウンド タスクの作成方法について説明します。
注 Windows Phone ストア アプリでは、デバイスのメモリが少なくなった場合、警告や OnCanceled イベントの発生なしにバックグラウンド タスクが終了することがあります。こうすることで、フォアグラウンドのアプリのユーザー エクスペリエンスが保証されます。バックグラウンド タスクは、このシナリオを処理できるように設計する必要があります。
理解しておく必要があること
テクノロジ
必要条件
- このトピックでは、既に JavaScript バックグラウンド タスクが作成されていることを前提とします。バックグラウンド タスクを直ちに構築する場合は、「クイック スタート: バックグラウンド タスクの作成と登録」をご覧ください。条件とトリガーについて詳しくは、「バックグラウンド タスクによるアプリのサポート」をご覧ください。
手順
ステップ 1: イベント ハンドラーにより、取り消し要求を認識します。
取り消しイベントを処理するメソッドを作ります。
次のフットプリントを持つ OnCanceled というメソッドを作ります。このメソッドは、バックグラウンド タスクに対して取り消し要求が出されると、必ず Windows ランタイムによって呼び出されるエントリ ポイントです。
OnCanceled 関数には、次のフットプリントがあることが条件付けられます。
function onCanceled(cancelSender, cancelReason) { // TODO: Add code to notify the background task that it is cancelled. }
バックグラウンド タスクに cancel という変数を追加します。これは、いつ取り消し要求を受け取ったかを示すために使います。
たとえば、このコード行を、その他の変数定義と共に、IBackgroundTask クラスの最上段に記述します。
var cancel = false;
手順 1. で作った OnCanceled メソッドで、cancel を true に設定します。
完全なバックグラウンド タスクのサンプル、OnCanceled メソッドでは、cancel が true に設定されます。
function onCanceled(cancelSender, cancelReason) { cancel = true; }
バックグラウンド タスクで処理を開始する前に、"canceled" イベント リスナーに OnCanceled メソッドを登録します。
たとえば、次のコード行を使います。
backgroundTaskInstance.addEventListener("canceled", onCanceled);
ステップ 2: 取り消しを処理して終了します。
Run メソッドは cancel 変数を監視する必要があります。したがって、この変数が true に設定された場合は、Run メソッドを終了することができます。
cancel が true に設定された場合は処理を停止するように、バックグラウンド タスク クラスのコードを変更します。
バックグラウンド タスクのサンプルでは、バックグラウンド タスクが取り消されたときに、期間タイマーのコールバックが停止するかどうかの確認を行います。
if (!cancel) { // Do work. } else { // Cancel. }
処理が停止したら、バックグラウンド タスク インスタンスの succeeded プロパティを false に設定してクリーンアップし、タスクの取り消しを記録します。close() を呼び出して関数を終了します。
バックグラウンド タスクのサンプルでは、LocalSettings の状態が記録されます。
if ((_cancelRequested == false) && (_progress < 100)) { // See the background task sample for this code. } else { // // If the cancellation handler indicated that the task was canceled, stop the background task. // console.log("Background " + backgroundTaskInstance.task.name + " Canceled"); backgroundTaskInstance.succeeded = false; key = backgroundTaskInstance.task.taskId.toString(); settings.values[key] = "Canceled"; close(); }
注釈
バックグラウンド タスクのサンプルをダウンロードして、メソッドのコンテキストに従ってコード例を確認できます。
上記のサンプル コードでは、説明の便宜上、バックグラウンド タスクのサンプルのバックグラウンド タスク (およびコールバック タイマー) の一部しか示していません。
メソッド例を実行します。
バックグラウンド タスクのサンプルのコンテキストがわかるように、以下に完全な JavaScript バックグラウンド タスクを示します。
//
// A JavaScript background task runs a specified JavaScript file.
//
(function () {
"use strict";
//
// The background task instance's activation parameters are available via Windows.UI.WebUI.WebUIBackgroundTaskInstance.current
//
var cancel = false,
progress = 0,
backgroundTaskInstance = Windows.UI.WebUI.WebUIBackgroundTaskInstance.current;
console.log("Background " + backgroundTaskInstance.task.name + " Starting...");
//
// Associate a cancellation handler with the background task.
//
function onCanceled(cancelSender, cancelReason) {
cancel = true;
}
backgroundTaskInstance.addEventListener("canceled", onCanceled);
//
// This function is set to run every 1000 milliseconds ten times and perform background task activity.
//
function onTimer() {
var key = null,
settings = Windows.Storage.ApplicationData.current.localSettings;
if (!cancel) {
if (progress < 100) {
//
// Simulate work being done.
//
setTimeout(onTimer, 1000);
//
// Indicate progress to the foreground application.
//
backgroundTaskInstance.progress = progress;
progress += 10;
} else {
//
// Use the succeeded property to indicate that this background task completed successfully.
//
backgroundTaskInstance.succeeded = true;
backgroundTaskInstance.progress = progress;
console.log("Background " + backgroundTaskInstance.task.name + " Completed");
//
// Write to localSettings to indicate that this background task completed.
//
key = backgroundTaskInstance.task.name;
settings.values[key] = "Completed";
//
// A JavaScript background task must call close when it is done.
//
close();
}
} else {
//
// If the cancellation handler indicated that the task was canceled, stop the background task.
//
console.log("Background " + backgroundTaskInstance.task.name + " Canceled");
backgroundTaskInstance.succeeded = false;
key = backgroundTaskInstance.task.taskId.toString();
settings.values[key] = "Canceled";
close();
}
}
//
// Start the timer function to simulate background task work.
//
setTimeout(onTimer, 1000);
})();