分享方式:


繼續用戶活動,即使是跨裝置

本主題描述如何協助用戶在其 PC 上的應用程式中,以及跨裝置恢復他們正在進行的活動。

備註

從 2021 年 7 月開始,透過其 Microsoft 帳戶 (MSA) 同步處理 Windows 裝置的活動歷程記錄的使用者,將無法再選擇在時間軸中上傳新活動。 他們仍然可以使用時間軸,並在其本機計算機上查看其活動歷程記錄(最新應用程式、網站和檔案的相關信息)。 AAD 連線的帳戶不會受到影響。

用戶活動和時程表

我們每天的時間分散在多個裝置上。 我們可能會在公共汽車上使用手機,白天使用電腦,然後在晚上使用手機或平板電腦。 從 Windows 10 組建 1803 或更新版本開始,建立 用戶活動 讓該活動出現在 Windows 時間軸和 Cortana 的 [挑選] 功能中。 時間軸是一個豐富的工作視圖,利用使用者活動以時間順序顯示您最近的工作內容。 它也可以包括您在不同裝置間進行的工作。

Windows 時間軸映像

同樣地,將手機連結至 Windows 計算機可讓您繼續先前在 iOS 或 Android 裝置上執行的動作。

請將 UserActivity 視為使用者在應用程式內所處理的特定專案。 例如,如果您使用 RSS 閱讀器,UserActivity 可能是您正在閱讀的資訊來源。 如果您正在玩遊戲,UserActivity 可能是您正在玩的關卡。 如果您正在收聽音樂程式,UserActivity 可能是您正在收聽的播放清單。 如果您正在處理文件,UserActivity 可能是您上次停止工作的地方,依此類推。 簡言之,UserActivity 代表您應用程式內的目的地,讓用戶能夠繼續他們所做的工作。

當您呼叫 UserActivity.CreateSession來與 UserActivity 互動時,系統會建立記錄,指出該 UserActivity的開始和結束時間。 當您在一段時間內重新與該 UserActivity 互動時,系統會為其記錄多個記錄。

將用戶活動新增至您的應用程式

UserActivity 是 Windows 中用戶參與的單位。 它有三個部分:用來啟動活動所屬應用程式的 URI、描述活動的視覺效果和元數據。

  1. ActivationUri 是用來以特定內容恢復應用程式的。 一般而言,此鏈接採用協定類型的協定處理程式形式(例如 “my-app://page2?action=edit”)或 AppUriHandler(例如,http://contoso.com/page2?action=edit)。
  2. VisualElements 公開類別,讓用戶能夠以可視化方式識別具有標題、描述或調適型卡片元素的活動。
  3. 最後,內容 是您可以儲存有關活動的元數據的位置,這些元數據可用於在特定環境下分組和擷取活動。 這通常採用 https://schema.org 數據的形式。

若要將 UserActivity 新增至您的應用程式:

  1. 當使用者的情境在應用程式內發生變更時,產生 UserActivity 物件(例如頁面導覽、新的遊戲層級等)
  2. 在 UserActivity 物件中填入必要欄位的最小集合:ActivityIdActivationUri,以及 UserActivity.VisualElements.DisplayText
  3. 將自訂方案處理程式新增至您的應用程式,以便可由 UserActivity重新激活。

UserActivity 可以只用幾行程式碼整合到應用程式中。 例如,假設在 MainPage 類別內的 MainPage.xaml.cs 中有這段程式碼(注意:假設為 using Windows.ApplicationModel.UserActivities;):

UserActivitySession _currentActivity;
private async Task GenerateActivityAsync()
{
    // Get the default UserActivityChannel and query it for our UserActivity. If the activity doesn't exist, one is created.
    UserActivityChannel channel = UserActivityChannel.GetDefault();
    UserActivity userActivity = await channel.GetOrCreateUserActivityAsync("MainPage");
 
    // Populate required properties
    userActivity.VisualElements.DisplayText = "Hello Activities";
    userActivity.ActivationUri = new Uri("my-app://page2?action=edit");
     
    //Save
    await userActivity.SaveAsync(); //save the new metadata
 
    // Dispose of any current UserActivitySession, and create a new one.
    _currentActivity?.Dispose();
    _currentActivity = userActivity.CreateSession();
}

在上述 GenerateActivityAsync() 方法中,第一行會取得使用者的 UserActivityChannel。 這是此應用程式活動將發佈至的動態牆。 下一行查詢名為 MainPage的活動的通道。

  • 您的應用程式應該以相同的標識碼命名活動,如此一來,每次用戶位於應用程式的特定位置時,都會產生相同的標識符。 例如,如果您的應用程式是以頁面為基礎,請使用頁面的標識符;如果以檔為基礎,請使用檔的名稱(或名稱的哈希)。
  • 如果摘要中有具有相同標識碼的現有活動,則會從通道傳回該活動, 設定為 [已發佈] ]。 如果沒有具有該名稱的活動,則會返回一個新的活動,並將 UserActivity.State 設定為
  • 活動的範圍會限定於您的應用程式。 您不需要擔心活動識別碼與其他應用程式中的標識碼相撞。

取得或建立 UserActivity之後,請指定其他兩個必要欄位:UserActivity.VisualElements.DisplayTextUserActivity.ActivationUri

接下來,呼叫 SaveAsync函數儲存 UserActivity 的元數據,最後呼叫 CreateSession函數,這會傳回一個 UserActivitySessionUserActivitySession 是用戶實際與 UserActivity互動時,可用來管理的物件。 例如,當使用者離開頁面時,我們應該在 Dispose() 上呼叫 。 在上述範例中,我們也在呼叫 Dispose()之前,先呼叫 _currentActivity 上的 CreateSession()。 這是因為我們已將 _currentActivity 設為頁面的成員欄位,而且我們希望在啟動新的活動之前停止現有的活動(注意:?的 null 條件運算符, 它在執行成員存取之前會先測試 null)。

因為在此情況下,ActivationUri 是自定義配置,因此我們也需要在應用程式指令清單中註冊通訊協定。 這在 Package.appmanifest XML 檔案中完成,或使用設計工具來完成。

若要使用設計工具進行變更,請按兩下專案中的 Package.appmanifest 檔案來啟動設計工具,選取 [宣告] 索引標籤,然後新增 通訊協定 定義。 目前唯一需要填寫的屬性是 Name。 它應該符合上述指定的 URI,my-app

現在,我們需要撰寫一些程式碼,告訴應用程式在通訊協定啟用時該怎麼做。 我們將覆寫 App.xaml.cs 中的 OnActivated 方法,以將 URI 傳遞至主頁面,如下所示:

protected override void OnActivated(IActivatedEventArgs e)
{
    if (e.Kind == ActivationKind.Protocol)
    {
        var uriArgs = e as ProtocolActivatedEventArgs;
        if (uriArgs != null)
        {
            if (uriArgs.Uri.Host == "page2")
            {
                // Navigate to the 2nd page of the  app
            }
        }
    }
    Window.Current.Activate();
}

此程式代碼會偵測應用程式是否透過通訊協議啟用。 如果是,則會查看應用程式應該執行的動作,以繼續啟動它的工作。 作為一個簡單的應用程式,此應用程式唯一恢復的活動就是在應用程式啟動時,將您放到第二頁。

使用調適型卡片來改善時程表體驗

用戶活動會出現在 Cortana 和時間軸中。 當活動出現在時間軸上時,我們使用 Adaptive Card 架構來顯示這些活動。 如果您未為每個活動提供調適型卡片,時間軸就會根據您的應用程式名稱和圖示、標題欄位和選擇性描述欄位,自動建立簡單的活動卡片。 以下是自適應卡片的有效負載範例及其產生的卡片。

調適型卡片 ]

調適型卡片載荷 JSON 字串範例:

{ 
  "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", 
  "type": "AdaptiveCard", 
  "version": "1.0",
  "backgroundImage": "https://winblogs.azureedge.net/win/2017/11/eb5d872c743f8f54b957ff3f5ef3066b.jpg", 
  "body": [ 
    { 
      "type": "Container", 
      "items": [ 
        { 
          "type": "TextBlock", 
          "text": "Windows Blog", 
          "weight": "bolder", 
          "size": "large", 
          "wrap": true, 
          "maxLines": 3 
        }, 
        { 
          "type": "TextBlock", 
          "text": "Training Haiti’s radiologists: St. Louis doctor takes her teaching global", 
          "size": "default", 
          "wrap": true, 
          "maxLines": 3 
        } 
      ] 
    } 
  ]
}

將調適型卡片的承載新增為 JSON 字串並加入到 UserActivity,如下所示:

activity.VisualElements.Content = 
Windows.UI.Shell.AdaptiveCardBuilder.CreateAdaptiveCardFromJson(jsonCardText); // where jsonCardText is a JSON string that represents the card

跨平台和服務對服務整合

如果您的應用程式執行跨平臺 (例如在 Android 和 iOS 上),或維護雲端中的用戶狀態,您可以透過 Microsoft Graph發佈 UserActivities。 一旦您的應用程式或服務使用 Microsoft 帳戶進行驗證,只需要兩個簡單的 REST 呼叫,即可使用上述相同的數據來產生 ActivityHistory 物件。

總結

您可以使用 UserActivity API,讓您的應用程式出現在 Timeline 和 Cortana 中。

關鍵 API