Продолжение работы пользователей даже на разных устройствах
В этом разделе описывается, как помочь пользователям возобновить работу приложения на компьютере и на разных устройствах.
Примечание.
С июля 2021 г. пользователи, у которых журнал действий синхронизирован на всех устройствах с Windows с использованием учетной записи Майкрософт (MSA), больше не смогут отправлять новые действия в представлении временной шкалы. У таких пользователей по-прежнему будет возможность использовать временную шкалу и просматривать историю действий (сведения о последних приложениях, веб-сайтах и файлах) на своем локальном компьютере. Это не затронет учетные записи, подключенные к AAD.
Действия пользователей и временная шкала
Наше время каждый день распространяется на несколько устройств. Мы можем использовать наш телефон во время автобуса, ПК в течение дня, а затем телефон или планшет в вечернее время. Начиная с Windows 10 сборки 1803 или более поздней версии, создание действия пользователя делает это действие отображаться на временной шкале Windows и в разделе "Выбор Кортаны", где я оставил функцию. Временная шкала — это расширенное представление задач, которое использует действия пользователей для отображения хронологического представления о том, над чем вы работали. Он также может включать то, что вы работали на разных устройствах.
Аналогичным образом, связывание телефона с компьютером с Windows позволяет продолжить то, что вы делали ранее на устройстве iOS или Android.
Думайте о UserActivity как о чем-то конкретном, над которым работал пользователь в приложении. Например, если вы используете средство чтения RSS, userActivity может быть каналом, который вы читаете. Если вы играете в игру, UserActivity может быть уровнем, который вы играете. Если вы прослушиваете музыкальное приложение, UserActivity может быть списком воспроизведения, который вы прослушиваете. Если вы работаете над документом, userActivity может быть местом, где вы не работали над ним, и т. д. Короче говоря, UserActivity представляет место назначения в приложении, чтобы пользователь мог возобновить то, что они делали.
При взаимодействии с UserActivity путем вызова UserActivity.CreateSession система создает запись журнала, указывающую время начала и окончания для этого 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.xaml.cs внутри класса MainPage (примечание: предполагается 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.State
установленным значением New. - Действия относятся к приложению. Вам не нужно беспокоиться о том, что идентификатор действия сталкивается с идентификаторами в других приложениях.
После получения или создания UserActivity укажите два других обязательных поля: UserActivity.VisualElements.DisplayText
и UserActivity.ActivationUri
.
Затем сохраните метаданные UserActivity, вызвав SaveAsync и, наконец, CreateSession, который возвращает userActivitySession. UserActivitySession — это объект, который можно использовать для управления, когда пользователь фактически участвует в UserActivity. Например, мы должны вызвать Dispose()
userActivitySession , когда пользователь покидает страницу. В приведенном выше примере мы также вызываем Dispose()
_currentActivity
перед вызовом CreateSession()
. Это связано с тем, что мы сделали _currentActivity
поле члена нашей страницы, и мы хотим остановить любое существующее действие перед началом нового (примечание. ?
Это оператор null-условный, который проверяет значение NULL перед выполнением доступа к члену).
Так как в этом случае это настраиваемая схема, ActivationUri
необходимо также зарегистрировать протокол в манифесте приложения. Это делается в XML-файле Package.appmanifest или с помощью конструктора.
Чтобы изменить конструктор, дважды щелкните файл Package.appmanifest в проекте, чтобы запустить конструктор, перейдите на вкладку "Объявления " и добавьте определение протокола . Единственное свойство, которое необходимо заполнить, в настоящее время — Name. Он должен соответствовать указанному выше my-app
URI.
Теперь нам нужно написать код, чтобы сообщить приложению, что делать при активации протоколом. Мы переопределим OnActivated
метод в App.xaml.cs, чтобы передать универсальный код ресурса (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();
}
Что делает этот код, определяет, было ли приложение активировано через протокол. Если это было, то будет видно, что приложение должно сделать, чтобы возобновить задачу, для которой она активируется. Будучи простым приложением, единственное действие, которое это приложение возобновляет, помещает вас на вторичную страницу при появлении приложения.
Использование адаптивных карточек для улучшения интерфейса временной шкалы
Действия пользователей отображаются в Кортаны и временной шкале. Когда действия отображаются на временной шкале, мы отображаем их с помощью платформы адаптивной карточки . Если вы не предоставляете адаптивную карточку для каждого действия, временная шкала автоматически создаст простую карточку действий на основе имени приложения и значка, поля заголовка и необязательного поля описания. Ниже приведен пример полезных данных адаптивной карты и карточки, которые она создает.
]
Пример строки 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) или поддерживает состояние пользователя в облаке, можно опубликовать UserActivities через Microsoft Graph. После проверки подлинности приложения или службы с помощью учетной записи Майкрософт просто требуется два простых вызова REST для создания объектов активности и журнала , используя те же данные, что и описано выше.
Итоги
Api UserActivity можно использовать для отображения приложения на временной шкале и Кортаны.
- Дополнительные сведения об API UserActivity
- Ознакомьтесь с примером кода.
- См . более сложные адаптивные карточки.
- Публикация UserActivity из iOS, Android или веб-службы с помощью Microsoft Graph.
- Дополнительные сведения о Project Rome на GitHub.