Поделиться через


Продолжение действий пользователей даже на разных устройствах

В этом разделе описывается, как помочь пользователям возобновить работу приложения на компьютере и на разных устройствах.

Замечание

Начиная с июля 2021 года пользователи с журналом действий, синхронизированным на устройствах Windows с помощью учетной записи Майкрософт (MSA), больше не смогут добавлять новые действия в Хронологию. Они по-прежнему смогут использовать временную шкалу и просматривать журнал действий (сведения о последних приложениях, веб-сайтах и файлах) на локальном компьютере. Учетные записи, подключенные к AAD, не будут затронуты.

Действия пользователей и временная шкала

Наше время каждый день распределяется между несколькими устройствами. Мы можем использовать наш телефон во время автобуса, ПК в течение дня, а затем телефон или планшет в вечернее время. Начиная с Windows 10 сборки 1803 или более поздней версии, создание действий пользователя позволяет этим действиям отображаться на шкале времени Windows и в функции Cortana «Продолжение с того места, где я остановился». Временная шкала — это расширенное представление задач, которое использует действия пользователей для отображения хронологического представления о том, над чем вы работали. Он также может включать то, над чем вы работали на разных устройствах.

изображение временной шкалы Windows

Аналогичным образом, связывание телефона с компьютером с Windows позволяет продолжить то, что вы делали ранее на устройстве iOS или Android.

Думайте о UserActivity как о чем-то конкретном, над которым работал пользователь в приложении. Например, если вы используете RSS-ридер, UserActivity может быть каналом, который вы читаете. Если вы играете в игру, UserActivity может быть уровнем, в который вы играете. Если вы используете приложение для прослушивания музыки, UserActivity может быть плейлистом, который вы слушаете. Если вы работаете над документом, UserActivity может быть местом, где вы остановились, работая над ним, и т. д. Короче говоря, UserActivity представляет собой место назначения в вашем приложении, что позволяет пользователю возобновить то, чем они занимались.

При взаимодействии с UserActivity через вызов UserActivity.CreateSessionсистема создает запись в истории, указывающую время начала и окончания этого 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 минимальным набором обязательных полей: ActivityId, ActivationUriи UserActivity.VisualElements.DisplayText.
  3. Добавьте настраиваемый обработчик схемы в ваше приложение, чтобы его можно было повторно активировать с помощью 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. Он должен соответствовать указанному выше URI, my-app.

Теперь нам нужно написать код, чтобы сообщить приложению, что делать при активации протоколом. Мы переопределим метод 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