バックグラウンド タスクを登録する方法 (HTML)
[ この記事は、Windows ランタイム アプリを作成する Windows 8.x および Windows Phone 8.x 開発者を対象としています。Windows 10 向けの開発を行っている場合は、「最新のドキュメント」をご覧ください]
ほとんどのバックグラウンド タスクを安全に登録できる再利用可能な関数の作成方法について説明します。 このトピックは、バックグラウンド タスクを登録するユーティリティ関数の作り方を順に説明します。このユーティリティ関数は、二重登録による問題を防ぐために、同じタスクが登録されていないかどうかをチェックしたうえでタスクを登録します。バックグラウンド タスクにシステムの条件を適用することができます。ここで紹介しているユーティリティ関数は、それ自体で完結した実用的なコード例となっています。
注
Windows Phone ストア アプリでは、バックグラウンド タスクの登録を試みる前に RequestAccessAsync を呼び出す必要があります。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: 登録の重複確認
既に登録されたタスクかどうかを確認します。同じタスクが二重に登録されると、1 回のトリガーにつきタスクが複数回実行され、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 オブジェクトを使ってタスクを登録します。このコードは、condition パラメーターが null かどうかを確認し、null でない場合は、その condition を登録オブジェクトに追加します。戻り値は、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 ストア アプリで一時停止イベント、再開イベント、バックグラウンド イベントをトリガーする方法 (デバッグ時)