Windows アプリ SDK アプリでユーザー アクティビティを作成する

ユーザー アクティビティは、ユーザーがアプリで実行するタスクを表します。 アクティビティを作成して、ユーザーが中断した場所を取得できるようにします。 アクティビティはローカルアクティビティ履歴に表示され、ユーザーが以前のタスクに戻るのに役立つWindows機能によって表示できます。

Note

タイムライン クラウド同期は、2021 年 7 月に非推奨になりました。 アプリによって作成されたユーザー アクティビティはローカルに保存され、Microsoft Graphタイムラインを介してデバイス間で同期されなくなります。 デバイスのローカル アクティビティ履歴は引き続き機能します。

前提条件

  • アプリはパッケージ化 (MSIX) であるか、パッケージ ID を持っている必要があります。
  • 特別な機能宣言は必要ありません。UserActivity API はすべてのパッケージ アプリで使用できます。

ユーザー アクティビティを作成する

UserActivityChannel クラスと UserActivity クラスを使用します。

using Windows.ApplicationModel.UserActivities;

private UserActivitySession? _currentSession;

private async Task CreateActivityAsync()
{
    var channel = UserActivityChannel.GetDefault();
    var activity = await channel.GetOrCreateUserActivityAsync("document-123");

    activity.ActivationUri = new Uri("myapp://open?doc=123");
    activity.VisualElements.DisplayText = "Quarterly Report";
    activity.VisualElements.Description = "Working on Q4 financial summary";

    await activity.SaveAsync();
    _currentSession = activity.CreateSession();
}

アクティビティ セッションは、ユーザーがこのタスクに現在関与していることを通知します。 ユーザーが別のタスクに切り替えたときに破棄します。

豊富なビジュアルの詳細を設定する

UserActivityVisualElements のプロパティを使用して、ユーザーにアクティビティを記述します。

UserActivity activity = new UserActivity("quarterly-report");

activity.VisualElements.DisplayText = "Quarterly Report";
activity.VisualElements.Description = "Last edited: Section 3 - Revenue Analysis";
activity.VisualElements.Attribution = new UserActivityAttribution(
    new Uri("ms-appx:///Assets/AppIcon.png"));

Note

AdaptiveCardBuilderWindows.UI.Shell)を使用すると、Adaptive Card 全体をアクティビティの表示としてレンダリングできますが、その表示領域は Windows Timeline の一部であり、Microsoft はこれを廃止しました。 新しいコードでは AdaptiveCardBuilder を使用しないでください。代わりに、上記の VisualElements プロパティを使用してください。

アクティビティからの起動を処理する

再開するアクティビティをユーザーが選択すると、アプリはプロトコル URI でアクティブ化されます。 アクティブ化ロジックで処理します。

var activatedArgs = AppInstance.GetCurrent().GetActivatedEventArgs();

if (activatedArgs.Kind == ExtendedActivationKind.Protocol)
{
    var protocolArgs = activatedArgs.Data as Windows.ApplicationModel.Activation.IProtocolActivatedEventArgs;
    if (protocolArgs?.Uri.Scheme == "myapp")
    {
        // Parse the query string manually; System.Web.HttpUtility isn't
        // available to apps that target .NET (as opposed to .NET Framework).
        string? docId = protocolArgs.Uri.Query
            .TrimStart('?')
            .Split('&', StringSplitOptions.RemoveEmptyEntries)
            .Select(pair => pair.Split('=', 2))
            .FirstOrDefault(pair => pair[0] == "doc")
            ?.ElementAtOrDefault(1);
        // Navigate to the document
    }
}

セッションを終了する

ユーザーがアクティビティの作業を停止したら、セッションを破棄します。

UserActivitySession? _currentSession = null;

_currentSession?.Dispose();
_currentSession = null;

ベスト プラクティス

  • 意味のあるアクティビティ ID を使用 する — ID はタスクを一意に識別する必要があります (ドキュメント パスやプロジェクト名など)。
  • 更新アクティビティ - ユーザーが進行状況を行ったときに SaveAsync() を呼び出して、説明を最新の状態に保ちます。
  • アクティブ化 URI を設定する - アクティビティがアプリを正しい状態で再起動できるように、常に URI を指定します。
  • 一度に 1 つのセッションを作成 する - 新しいセッションを作成する前に、前のセッションを破棄します。

詳細なガイダンスについては、「 ユーザー アクティビティのベスト プラクティス」を参照してください。