バックグラウンド タスクの登録のグループ化
重要な API
BackgroundTaskRegistrationGroup クラス
バックグラウンド タスクは、グループに登録できるようになりました。このグループは、論理的な名前空間と考えることができます。 このように分離することで、アプリの異なるコンポーネントや異なるライブラリが相互にバックグラウンド タスク登録に干渉しないようにできます。
アプリと、アプリで使用するフレームワーク (またはライブラリ) がバックグラウンド タスクを同じ名前で登録する場合、フレームワークのバックグラウンド タスク登録がアプリによって誤って削除される可能性があります。 また、アプリ作成者は、BackgroundTaskRegistration.AllTasks を使用して登録されているすべてのバックグラウンド タスクの登録を解除できるため、フレームワークとライブラリのバックグラウンド タスク登録を誤って削除する可能性もあります。 グループを使用すると、バックグラウンド タスク登録を分離できるため、このようなことは発生しません。
グループの機能
- グループは、GUID で一意に識別できます。 また、デバッグ中に読みやすい、関連するフレンドリ名文字列を設定できます。
- 複数のバックグラウンド タスクをグループに登録できます。
- グループに登録されているバックグラウンド タスクは、BackgroundTaskRegistration.AllTasks には表示されません。 そのため、現在 BackgroundTaskRegistration.AllTasks を使用してタスクの登録を解除しているアプリでは、グループに登録したバックグラウンド タスクを誤って登録解除することはありません。 グループの一部として登録されているすべてのバックグラウンド トリガーの登録を解除する方法については、以下の「グループのバックグラウンド タスクの登録を解除する」をご覧ください。
- 各バックグラウンド タスク登録では、関連付けられているグループを判断するための Group プロパティが設定されます。
- グループを使用してインプロセス バックグラウンド タスクを登録すると、アクティブ化時に Application.OnBackgroundActivated の代わりに BackgroundTaskRegistrationGroup.BackgroundActivated イベントが発生します。
グループにバックグラウンド タスクを登録する
以下では、バックグラウンド タスクをグループの一部として登録する方法を示しています (この例では、タイム ゾーンの変更によってタスクがトリガーされます)。
private const string groupFriendlyName = "myGroup";
private const string groupId = "3F2504E0-4F89-41D3-9A0C-0305E82C3301";
private const string myTaskName = "My Background Trigger";
public static void RegisterBackgroundTaskInGroup()
{
BackgroundTaskRegistrationGroup group = BackgroundTaskRegistration.GetTaskGroup(groupId);
bool isTaskRegistered = false;
// See if this task already belongs to a group
if (group != null)
{
foreach (var taskKeyValue in group.AllTasks)
{
if (taskKeyValue.Value.Name == myTaskName)
{
isTaskRegistered = true;
break;
}
}
}
// If the background task is not in a group, register it
if (!isTaskRegistered)
{
if (group == null)
{
group = new BackgroundTaskRegistrationGroup(groupId, groupFriendlyName);
}
var builder = new BackgroundTaskBuilder();
builder.Name = myTaskName;
builder.TaskGroup = group; // we specify the group, here
builder.SetTrigger(new SystemTrigger(SystemTriggerType.TimeZoneChange, false));
// Because builder.TaskEntryPoint is not specified, OnBackgroundActivated() will be raised when the background task is triggered
BackgroundTaskRegistration task = builder.Register();
}
}
グループのバックグラウンド タスクの登録を解除する
以下では、グループの一部として登録されたバックグラウンド タスクの登録を解除する方法を示しています。 グループに登録されているバックグラウンド タスクは BackgroundTaskRegistration.AllTasks に表示されないため、グループを反復処理して、各グループに登録されたバックグラウンド タスクを見つけ、登録を解除する必要があります。
private static void UnRegisterAllTasks()
{
// Unregister tasks that are part of a group
foreach (var groupKeyValue in BackgroundTaskRegistration.AllTaskGroups)
{
foreach (var groupedTask in groupKeyValue.Value.AllTasks)
{
groupedTask.Value.Unregister(true); // passing true to cancel currently running instances of this background task
}
}
// Unregister tasks that aren't part of a group
foreach(var taskKeyValue in BackgroundTaskRegistration.AllTasks)
{
taskKeyValue.Value.Unregister(true); // passing true to cancel currently running instances of this background task
}
}
永続イベントを登録する
インプロセス バックグラウンド タスクと一緒にバックグラウンド タスク登録グループを使用している場合、バックグラウンド アクティブ化は、Application オブジェクトと CoreApplication オブジェクトのいずれでもなく、グループのイベントに伝達されます。 これにより、Application オブジェクトにすべてのアクティブ化コード パスを配置せずに、アプリ内の複数のコンポーネントでアクティブ化を処理できるようになります。 以下では、グループのバックグラウンド アクティブ化イベントの登録方法を示しています。 まず、BackgroundTaskRegistration.GetTaskGroup を確認して、グループが既に登録されているかどうかを判断します。 登録されていない場合、指定の ID とフレンドリ名で新しいグループを作成します。 その後、グループの BackgroundActivated イベントにイベント ハンドラーを登録します。
void RegisterPersistentEvent()
{
var group = BackgroundTaskRegistration.GetTaskGroup(groupId);
if (group == null)
{
group = new BackgroundTaskRegistrationGroup(groupId, groupFriendlyName);
}
group.BackgroundActivated += MyEventHandler;
}