本主題描述如何協助用戶在其 PC 上的應用程式中,以及跨裝置恢復他們正在進行的活動。
備註
從 2021 年 7 月開始,透過其 Microsoft 帳戶 (MSA) 同步處理 Windows 裝置的活動歷程記錄的使用者,將無法再選擇在時間軸中上傳新活動。 他們仍然可以使用時間軸,並在其本機計算機上查看其活動歷程記錄(最新應用程式、網站和檔案的相關信息)。 AAD 連線的帳戶不會受到影響。
用戶活動和時程表
我們每天的時間分散在多個裝置上。 我們可能會在公共汽車上使用手機,白天使用電腦,然後在晚上使用手機或平板電腦。 從 Windows 10 組建 1803 或更新版本開始,建立 用戶活動 讓該活動出現在 Windows 時間軸和 Cortana 的 [挑選] 功能中。 時間軸是一個豐富的工作視圖,利用使用者活動以時間順序顯示您最近的工作內容。 它也可以包括您在不同裝置間進行的工作。
同樣地,將手機連結至 Windows 計算機可讓您繼續先前在 iOS 或 Android 裝置上執行的動作。
請將 UserActivity 視為使用者在應用程式內所處理的特定專案。 例如,如果您使用 RSS 閱讀器,UserActivity 可能是您正在閱讀的資訊來源。 如果您正在玩遊戲,UserActivity 可能是您正在玩的關卡。 如果您正在收聽音樂程式,UserActivity 可能是您正在收聽的播放清單。 如果您正在處理文件,UserActivity 可能是您上次停止工作的地方,依此類推。 簡言之,UserActivity 代表您應用程式內的目的地,讓用戶能夠繼續他們所做的工作。
當您呼叫 UserActivity.CreateSession來與 UserActivity 互動時,系統會建立記錄,指出該 UserActivity的開始和結束時間。 當您在一段時間內重新與該 UserActivity 互動時,系統會為其記錄多個記錄。
將用戶活動新增至您的應用程式
UserActivity 是 Windows 中用戶參與的單位。 它有三個部分:用來啟動活動所屬應用程式的 URI、描述活動的視覺效果和元數據。
-
ActivationUri 是用來以特定內容恢復應用程式的。 一般而言,此鏈接採用協定類型的協定處理程式形式(例如 “my-app://page2?action=edit”)或 AppUriHandler(例如,
http://contoso.com/page2?action=edit)。 - VisualElements 公開類別,讓用戶能夠以可視化方式識別具有標題、描述或調適型卡片元素的活動。
- 最後,內容 是您可以儲存有關活動的元數據的位置,這些元數據可用於在特定環境下分組和擷取活動。 這通常採用 https://schema.org 數據的形式。
若要將 UserActivity 新增至您的應用程式:
- 當使用者的情境在應用程式內發生變更時,產生 UserActivity 物件(例如頁面導覽、新的遊戲層級等)
- 在 UserActivity 物件中填入必要欄位的最小集合:ActivityId、ActivationUri,以及 UserActivity.VisualElements.DisplayText。
- 將自訂方案處理程式新增至您的應用程式,以便可由 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.DisplayText和 UserActivity.ActivationUri。
接下來,呼叫 SaveAsync函數儲存 UserActivity 的元數據,最後呼叫 CreateSession函數,這會傳回一個 UserActivitySession。
UserActivitySession 是用戶實際與 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 上),或維護雲端中的用戶狀態,您可以透過
總結
您可以使用 UserActivity API,讓您的應用程式出現在 Timeline 和 Cortana 中。
- 深入瞭解 UserActivity API
- 請參閱 範例程式代碼。
- 請參閱 更複雜的調適型卡片。
- 透過 Microsoft Graph,從 iOS、Android 或 Web 服務發佈 UserActivity。
- 您可以在 GitHub 上深入瞭解 Project Rome。