クイック スタート: バックグラウンド タスクの作成と登録 (HTML)
[ この記事は、Windows ランタイム アプリを作成する Windows 8.x および Windows Phone 8.x 開発者を対象としています。Windows 10 向けの開発を行っている場合は、「最新のドキュメント」をご覧ください]
このトピックでは、アプリのバックグラウンド タスク ワーカーを作成して登録する方法について説明します。
必要条件
- バックグラウンド タスクを提供する準備が整っているアプリがあること。
バックグラウンド タスク クラスを作る
バックグラウンドで実行されるコードを含む独立したメソッドを作ります。このコードは、特定のイベントがトリガーされると実行されます。どのアプリからでも使うことができるトリガーの種類の一覧については、「SystemTrigger」と「MaintenanceTrigger」をご覧ください。
次の手順では、Windows.UI.WebUI.WebUIBackgroundTaskInstance を使うバックグラウンド タスク ワーカーの作成方法について説明します。始める前に、Microsoft Visual Studio で新しい空の JavaScript ファイルを作ります。
プロジェクトに新しい JavaScript ファイルを作ります。このファイル内の関数とコードがバックグラウンドで実行される処理です。
作成を始める際には、次のスケルトン コードが役に立ちます。
// // A JavaScript background task is specified in a .js file. The name of the file is used to // launch the background task. // (function () { "use strict"; // // This var is used to get information about the current instance of the background task. // var backgroundTaskInstance = Windows.UI.WebUI.WebUIBackgroundTaskInstance.current; // // This function will do the work of your background task. // function doWork() { var key = null, settings = Windows.Storage.ApplicationData.current.localSettings; // Write JavaScript code here to do work in the background. // // Record information in LocalSettings to communicate with the app. // key = backgroundTaskInstance.task.taskId.toString(); settings.values[key] = "Succeeded"; // // A JavaScript background task must call close when it is done. // close(); } doWork(); })();
バックグラウンド タスクは、処理の停止要求を認識する必要があります。まず、"canceled" イベントのリスナーを追加し、バックグラウンド タスクに通知するための "canceled" という名前の変数を追加します。
バックグラウンド タスクのサンプルでは、onCanceled 関数で "canceled" イベントをリッスンしています。
var cancel = false; // // Associate a cancellation handler with the background task. // function onCanceled(cancelSender, cancelReason) { cancel = true; } backgroundTaskInstance.addEventListener("canceled", onCanceled);
次に、canceled が true に設定された場合に処理を停止して終了するようにコードを変更します。
バックグラウンド タスクのサンプルでは、SampleBackgroundTask という名前のタスクを作っています。
// // A JavaScript background task is specified in a .js file. The name of the file is used to // launch the background task. // (function () { "use strict"; // // This var is used to get information about the current instance of the background task. // var backgroundTaskInstance = Windows.UI.WebUI.WebUIBackgroundTaskInstance.current; // // This function will do the work of your background task. // function doWork() { var key = null, settings = Windows.Storage.ApplicationData.current.localSettings; // // TODO: Write your JavaScript code here to do work in the background. // If you write a loop or callback, remember have it check for canceled==false. // // // Record information in LocalSettings to communicate with the app. // key = backgroundTaskInstance.task.taskId.toString(); settings.values[key] = "Succeeded"; // // A JavaScript background task must call close when it is done. // close(); } if (!canceled) { doWork(); } else { // // Record information in LocalSettings to communicate with the app. // key = backgroundTaskInstance.task.taskId.toString(); settings.values[key] = "Canceled"; // // A JavaScript background task must call close when it is done. // close(); } })();
バックグラウンド タスクは、処理が完了するか取り消された場合、組み込みの close() メソッドを必ず呼び出す必要があります。バックグラウンド タスクが終了しないと、そのプロセスが存在したままとなり、バックグラウンド タスクが完了した場合でも、メモリやバッテリー残量が無駄に消費されます。
JavaScript のバックグラウンド タスクが完了するか取り消されたタイミングで必ず、close() を呼び出すようにしてください。
close();
次の手順では、既にあるアプリ ("default.js" など) にコードを追加します。
注 バックグラウンド タスクを登録するための専用の関数を作成することもできます (「バックグラウンド タスクを登録する方法」を参照)。その場合、次の 3 つの手順は不要です。単にトリガーを作成し、タスクの名前とエントリ ポイント、(必要に応じて) 条件と併せて登録関数に渡すだけで済みます。
バックグラウンド タスクの登録
同じバックグラウンド タスクが登録されていないかどうかを、BackgroundTaskRegistration.allTasks プロパティを反復処理して確認します。この確認は重要です。既にあるバックグラウンド タスクの二重登録をアプリで確認しなかった場合、同じタスクが何度も登録され、パフォーマンスが低下したり、タスクの CPU 時間を使い切って処理を完了できなくなるなどの問題が生じます。
次の例では、allTasks プロパティを反復処理し、タスクが既に登録されていた場合はフラグ変数を true に設定します。
var taskRegistered = false; var exampleTaskName = "Example background task worker name"; var background = Windows.ApplicationModel.Background; var iter = background.BackgroundTaskRegistration.allTasks.first(); while (iter.hasCurrent) { var task = iter.current.value; if (task.name === exampleTaskName) { taskRegistered = true; break; } iter.moveNext(); }
まだ登録されていない場合は、register 関数を呼び出してバックグラウンド タスクのファイル名と SystemTrigger を渡してバックグラウンド タスクを登録します。
バックグラウンド タスク トリガーは、バックグラウンド タスクが実行されるタイミングを制御します。指定できるシステム トリガーの一覧については、SystemTrigger をご覧ください。
if (taskRegistered != true) { var builder = new Windows.ApplicationModel.Background.BackgroundTaskBuilder(); var trigger = new Windows.ApplicationModel.Background.SystemTrigger(Windows.ApplicationModel.Background.SystemTriggerType.timeZoneChange, false); builder.name = exampleTaskName; builder.taskEntryPoint = "js\\ExampleBackgroundTask.js"; builder.setTrigger(trigger); var task = builder.register(); }
トリガー イベントの発生後、どのようなときにタスクを実行するかという条件を追加することもできます (省略可能)。たとえば、ユーザーが存在するときにだけタスクを実行する場合、UserPresent という条件を使います。指定できる条件の一覧については、「SystemConditionType」をご覧ください。
注
Windows 8.1 以降では、バックグラウンド タスクの登録パラメーターが登録時に検証されます。いずれかの登録パラメーターが有効でない場合は、エラーが返されます。アプリは、バックグラウンド タスクの登録が失敗するシナリオを処理できる必要があります。たとえば、条件ステートメントを使って登録エラーを確認し、失敗した登録は別のパラメーター値を使ってやり直してみます。
if (taskRegistered != true) { var builder = new Windows.ApplicationModel.Background.BackgroundTaskBuilder(); var trigger = new Windows.ApplicationModel.Background.SystemTrigger(Windows.ApplicationModel.Background.SystemTriggerType.timeZoneChange, false); builder.name = exampleTaskName; builder.taskEntryPoint = "js\\ExampleBackgroundTask.js"; builder.setTrigger(trigger); builder.addCondition(new Windows.ApplicationModel.Background.SystemCondition(Windows.ApplicationModel.Background.SystemConditionType.userPresent)); var task = builder.register(); }
注
Windows Phone ストア アプリでは、バックグラウンド タスクの登録を試みる前に RequestAccessAsync を呼び出す必要があります。Windows では、実行するにはアプリをロック画面に配置する必要があるバックグラウンド タスク セットにのみこの呼び出しが必要ですが、Phone ではどのバックグラウンド タスクを登録する場合でも、その前に一度このメソッドを呼び出す必要があります。
更新のリリース後に Windows Phone アプリが引き続き適切に実行されるようにするには、更新された後にアプリを起動するときに RemoveAccess、RequestAccessAsync の順に呼び出す必要があります。詳しくは、「バックグラウンド タスクのガイドライン (HTML)」をご覧ください。
バックグラウンド タスクの完了を処理する
アプリがアクティブになるたびに "completed" イベント リスナーに登録することによって、バックグラウンド タスクの進行状況と完了をアプリで確認することができます。
アプリがバックグラウンド ワーカーの完了を認識するのに利用できる関数を作ります。
次のバックグラウンド タスクのサンプルでは、onCompleted という名前の関数を追加しています。
// // Handle background task completion. // "completeHandler": function (task) { this.onCompleted = function (args) { try { var key = task.taskId; var settings = Windows.Storage.ApplicationData.current.localSettings; var status = settings.values[key]; switch (task.name) { case BackgroundTaskSample.sampleBackgroundTaskName: BackgroundTaskSample.sampleBackgroundTaskStatus = status; SampleBackgroundTask.updateUI(); break; case BackgroundTaskSample.sampleBackgroundTaskWithConditionName: BackgroundTaskSample.sampleBackgroundTaskWithConditionStatus = status; SampleBackgroundTaskWithCondition.updateUI(); break; case BackgroundTaskSample.servicingCompleteTaskName: BackgroundTaskSample.servicingCompleteTaskStatus = status; ServicingComplete.updateUI(); break; case BackgroundTaskSample.javaScriptBackgroundTaskName: BackgroundTaskSample.javaScriptBackgroundTaskStatus = status; JavaScriptBackgroundTask.updateUI(); break; case BackgroundTaskSample.timeTriggerTaskName: BackgroundTaskSample.timeTriggerTaskStatus = status; TimeTriggerBackgroundTask.updateUI(); break; } } catch (ex) { //WinJS.log && WinJS.log(ex, "sample", "status"); } }; }
この関数によって "completed" イベント リスナーに受信登録します。
次のバックグラウンド タスクのサンプルでは、"completed" イベントに onCompleted を追加しています。
task.addEventListener("completed", new BackgroundTaskSample.completeHandler(task).onCompleted);
アプリがバックグラウンド タスクを使うことをアプリ マニフェストで宣言する
アプリで実際にバックグラウンド タスクを登録する前に、各バックグラウンド タスク (および使用するトリガー) をアプリ マニフェストで宣言する必要があります。
アプリ マニフェストを開き、Extensions 要素に移動します。アプリで使われるバックグラウンド タスク クラスごとに、カテゴリを "windows.backgroundTasks" に設定した Extension 要素を追加します。バックグラウンド タスクによって使われるトリガーのタイプは逐一宣言する必要があります。宣言されていないトリガー タイプにバックグラウンド タスクを登録することはできません。
次のバックグラウンド タスクのサンプルでは、バックグラウンド タスク ワーカーを 3 つ登録しています。
<Extension Category="windows.backgroundTasks" StartPage="js\backgroundtask.js"> <BackgroundTasks> <Task Type="systemEvent" /> </BackgroundTasks> </Extension> <Extension Category="windows.backgroundTasks" EntryPoint="Tasks.SampleBackgroundTask"> <BackgroundTasks> <Task Type="systemEvent" /> <Task Type="timer" /> </BackgroundTasks> </Extension> <Extension Category="windows.backgroundTasks" EntryPoint="Tasks.ServicingComplete"> <BackgroundTasks> <Task Type="systemEvent" /> </BackgroundTasks> </Extension>
要約
ここでは、バックグラウンド タスク クラスの記述方法、アプリ内からバックグラウンド タスクを登録する方法、バックグラウンド タスクが完了したことをアプリで認識する方法の基本について学習しました。また、OS を使ってアプリでバックグラウンド タスクを登録するために、アプリ マニフェストを更新する方法についても学習しました。
注 バックグラウンド タスクのサンプルをダウンロードして、バックグラウンド タスクを使う完全で堅牢な JavaScript アプリのコンテキストで、これらのコード例 (他のコード例もあります) を確認することができます。
関連トピック
バックグラウンド タスクに関する手順を詳しく説明するトピック
バックグラウンド タスクのガイダンス
Windows ストア アプリで一時停止イベント、再開イベント、バックグラウンド イベントをトリガーする方法 (デバッグ時)
バックグラウンド タスクの API リファレンス