アプリケーション マニフェストでのバックグラウンド タスクの宣言
重要な API
アプリ マニフェストでバックグラウンド タスクを拡張機能として宣言し、バックグラウンド タスクを使うことができるようにします。
重要
この記事は、プロセス外のバックグラウンド タスクに固有です。 インプロセス バックグラウンド タスクはマニフェストで宣言されていません。
プロセス外のバックグラウンド タスクは、アプリ マニフェストで宣言する必要があります。そうしないと、アプリで登録できなくなります (例外がスローされます)。 さらに、認定に合格するには、プロセス外のバックグラウンド タスクをアプリケーション マニフェストで宣言する必要があります。
このトピックでは、1 つ以上のバックグラウンド タスク クラスが作成されていること、およびアプリが少なくとも 1 つのトリガーに応答して実行する各バックグラウンド タスクを登録していることを前提としています。
拡張機能を手動で追加する
アプリケーション マニフェスト (Package.appxmanifest) を開き、Application 要素に移動します。 Extensions 要素を作成します (まだ存在しない場合)。
次のスニペットは、 バックグラウンド タスクのサンプルから取得します。
<Application Id="App"
...
<Extensions>
<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>
</Extensions>
</Application>
バックグラウンド タスク拡張機能を追加する
最初のバックグラウンド タスクを宣言します。
このコードを Extensions 要素にコピーします (次の手順で属性を追加します)。
<Extensions>
<Extension Category="windows.backgroundTasks" EntryPoint="">
<BackgroundTasks>
<Task Type="" />
</BackgroundTasks>
</Extension>
</Extensions>
EntryPoint 属性を変更して、バックグラウンド タスク (namespace.classname) を登録するときに、コードでエントリ ポイントと同じ文字列を使用するようにします。
この例では、エントリ ポイントは ExampleBackgroundTaskNameSpace.ExampleBackgroundTaskClassName です。
<Extensions>
<Extension Category="windows.backgroundTasks" EntryPoint="Tasks.ExampleBackgroundTaskClassName">
<BackgroundTasks>
<Task Type="" />
</BackgroundTasks>
</Extension>
</Extensions>
Task Type 属性の一覧を変更して、このバックグラウンド タスクで使用されるタスク登録の種類を示します。 バックグラウンド タスクが複数のトリガーの種類に登録されている場合は、それぞれに Task 要素と Type 属性を追加します。
注 使っているトリガーの各種類を確実に列記してください。そうしないと、バックグラウンド タスクは宣言されていない種類のトリガーには登録されません (Register メソッドが失敗し、例外がスローされます)。
このスニペットの例は、システム イベント トリガーとプッシュ通知の使用を示しています。
<Extension Category="windows.backgroundTasks" EntryPoint="Tasks.BackgroundTaskClass">
<BackgroundTasks>
<Task Type="systemEvent" />
<Task Type="pushNotification" />
</BackgroundTasks>
</Extension>
複数のバックグラウンド タスク拡張機能を追加する
アプリによって登録された追加のバックグラウンド タスク クラスごとに、手順 2 を繰り返します。
次の例は、 background タスク サンプルの完全な Application 要素です。 これは、合計 3 種類のトリガーを持つ 2 つのバックグラウンド タスク クラスの使用を示しています。 この例の Extensions セクションをコピーし、必要に応じて変更して、アプリケーション マニフェストでバックグラウンド タスクを宣言します。
<Applications>
<Application Id="App"
Executable="$targetnametoken$.exe"
EntryPoint="BackgroundTask.App">
<uap:VisualElements
DisplayName="BackgroundTask"
Square150x150Logo="Assets\StoreLogo-sdk.png"
Square44x44Logo="Assets\SmallTile-sdk.png"
Description="BackgroundTask"
BackgroundColor="#00b2f0">
<uap:LockScreen Notification="badgeAndTileText" BadgeLogo="Assets\smalltile-Windows-sdk.png" />
<uap:SplashScreen Image="Assets\Splash-sdk.png" />
<uap:DefaultTile DefaultSize="square150x150Logo" Wide310x150Logo="Assets\tile-sdk.png" >
<uap:ShowNameOnTiles>
<uap:ShowOn Tile="square150x150Logo" />
<uap:ShowOn Tile="wide310x150Logo" />
</uap:ShowNameOnTiles>
</uap:DefaultTile>
</uap:VisualElements>
<Extensions>
<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>
</Extensions>
</Application>
</Applications>
バックグラウンド タスクを実行する場所を宣言する
バックグラウンド タスクの実行場所を指定できます。
- 既定では、BackgroundTaskHost.exe プロセスで実行されます。
- フォアグラウンド アプリケーションと同じプロセスで。
ResourceGroup
を使用して、複数のバックグラウンド タスクを同じホスティング プロセスに配置するか、別のプロセスに分割します。SupportsMultipleInstances
を使用して、新しいトリガーが発生するたびに独自のリソース制限 (メモリ、cpu) を取得する新しいプロセスでバックグラウンド プロセスを実行します。
フォアグラウンド アプリケーションと同じプロセスで実行する
フォアグラウンド アプリケーションと同じプロセスで実行されるバックグラウンド タスクを宣言する XML の例を次に示します。
<Extensions>
<Extension Category="windows.backgroundTasks" EntryPoint="ExecModelTestBackgroundTasks.ApplicationTriggerTask">
<BackgroundTasks>
<Task Type="systemEvent" />
</BackgroundTasks>
</Extension>
</Extensions>
EntryPoint を指定すると、トリガーの起動時に、アプリケーションは指定したメソッドへのコールバックを受け取ります。 EntryPoint を指定していない場合、アプリケーションは OnBackgroundActivated() を介してコールバックを受け取ります。 詳細については、 プロセス内のバックグラウンド タスクの作成と登録 を参照してください。
ResourceGroup 属性を使用して、バックグラウンド タスクの実行場所を指定します。
次に示すのは、BackgroundTaskHost.exe プロセスで実行されるバックグラウンド タスクを宣言する XML の例ですが、同じアプリのバックグラウンド タスクの他のインスタンスとは別のインスタンスで実行されます。 ResourceGroup
属性に注意してください。これは、一緒に実行するバックグラウンド タスクを識別します。
<Extensions>
<Extension Category="windows.backgroundTasks" EntryPoint="BackgroundTasks.SessionConnectedTriggerTask" ResourceGroup="foo">
<BackgroundTasks>
<Task Type="systemEvent" />
</BackgroundTasks>
</Extension>
<Extension Category="windows.backgroundTasks" EntryPoint="BackgroundTasks.TimeZoneTriggerTask" ResourceGroup="foo">
<BackgroundTasks>
<Task Type="systemEvent" />
</BackgroundTasks>
</Extension>
<Extension Category="windows.backgroundTasks" EntryPoint="BackgroundTasks.TimerTriggerTask" ResourceGroup="bar">
<BackgroundTasks>
<Task Type="timer" />
</BackgroundTasks>
</Extension>
<Extension Category="windows.backgroundTasks" EntryPoint="BackgroundTasks.ApplicationTriggerTask" ResourceGroup="bar">
<BackgroundTasks>
<Task Type="general" />
</BackgroundTasks>
</Extension>
<Extension Category="windows.backgroundTasks" EntryPoint="BackgroundTasks.MaintenanceTriggerTask" ResourceGroup="foobar">
<BackgroundTasks>
<Task Type="general" />
</BackgroundTasks>
</Extension>
</Extensions>
SupportsMultipleInstances 属性を使用してトリガーが起動するたびに、新しいプロセスで実行する
この例では、新しいトリガーが発生するたびに独自のリソース制限 (メモリと CPU) を取得する新しいプロセスで実行されるバックグラウンド タスクを宣言します。 この動作を有効にする SupportsMultipleInstances
の使用に注意してください。 この属性を使用するには、SDK バージョン '10.0.15063' (Windows 10 Creators Update) 以降をターゲットにする必要があります。
<Package
xmlns:uap4="http://schemas.microsoft.com/appx/manifest/uap/windows10/4"
...
<Applications>
<Application ...>
...
<Extensions>
<Extension Category="windows.backgroundTasks" EntryPoint="BackgroundTasks.TimerTriggerTask">
<BackgroundTasks uap4:SupportsMultipleInstances="true">
<Task Type="timer" />
</BackgroundTasks>
</Extension>
</Extensions>
</Application>
</Applications>
Note
SupportsMultipleInstances
と組み合わせてResourceGroup
またはServerName
を指定することはできません。