Continuar la actividad del usuario, incluso en diferentes dispositivos

En este tema se describe cómo ayudar a los usuarios a reanudar lo que hacían en la aplicación en su PC y en todos los dispositivos.

Nota:

A partir de julio de 2021, los usuarios que tienen el historial de actividades sincronizado en sus dispositivos Windows mediante de su cuenta de Microsoft (MSA), ya no tendrán la opción de cargar nuevas actividades en la Línea de tiempo. Aún así, seguirán teniendo la opción de usar la Línea de tiempo y ver su historial de actividades (esto es, la información sobre las aplicaciones, los sitios web y los archivos recientes) en su equipo local. Las cuentas conectadas a AAD no se verán afectadas.

Actividades de usuario y escala de tiempo

Nuestra hora cada día se distribuye entre varios dispositivos. Podríamos usar nuestro teléfono mientras está en el autobús, un PC durante el día, luego un teléfono o tableta por la noche. A partir de la compilación 1803 o posterior de Windows 10, la creación de una actividad de usuario hace que esa actividad aparezca en la escala de tiempo de Windows y en la opción Seleccionar de Cortana donde dejé la característica. La escala de tiempo es una vista de tareas enriquecida que aprovecha las actividades del usuario para mostrar una vista cronológica de lo que ha estado trabajando. También puede incluir lo que estaba trabajando en todos los dispositivos.

Imagen de escala de tiempo de Windows

Del mismo modo, vincular el teléfono a su PC Windows le permite continuar lo que estaba haciendo anteriormente en su dispositivo iOS o Android.

Piense en userActivity como algo específico en el que el usuario estaba trabajando en la aplicación. Por ejemplo, si usa un lector RSS, un UserActivity podría ser la fuente que está leyendo. Si estás jugando un juego, UserActivity podría ser el nivel que estás jugando. Si estás escuchando una aplicación de música, UserActivity podría ser la lista de reproducción a la que estás escuchando. Si está trabajando en un documento, UserActivity podría ser donde dejó de trabajar en él, etc. En resumen, una UserActivity representa un destino dentro de la aplicación para que el usuario reanude lo que estaba haciendo.

Cuando se interactúa con un UserActivity llamando a UserActivity.CreateSession, el sistema crea un registro de historial que indica la hora de inicio y finalización de esa UserActivity. A medida que vuelva a interactuar con esa UserActivity a lo largo del tiempo, se registran varios registros de historial para él.

Agregar actividades de usuario a la aplicación

UserActivity es la unidad de interacción del usuario en Windows. Tiene tres partes: un URI que se usa para activar la aplicación a la que pertenece la actividad, los objetos visuales y los metadatos que describen la actividad.

  1. ActivationUri se usa para reanudar la aplicación con un contexto específico. Normalmente, este vínculo tiene la forma de controlador de protocolo para un esquema (por ejemplo, "my-app://page2?action=edit") o de appUriHandler (por ejemplo, http://contoso.com/page2?action=edit).
  2. VisualElements expone una clase que permite al usuario identificar visualmente una actividad con un título, una descripción o elementos de tarjeta adaptable.
  3. Por último, Content es donde puede almacenar metadatos para la actividad que se puede usar para agrupar y recuperar actividades en un contexto específico. A menudo, esto adopta la forma de https://schema.org datos.

Para agregar un UserActivity a la aplicación:

  1. Generar objetos UserActivity cuando el contexto del usuario cambie dentro de la aplicación (como la navegación de páginas, el nuevo nivel de juego, etc.)
  2. Rellene los objetos UserActivity con el conjunto mínimo de campos obligatorios: ActivityId, ActivationUri y UserActivity.VisualElements.DisplayText.
  3. Agregue un controlador de esquema personalizado a la aplicación para que un UserActivity pueda volver a activarlo.

Una UserActivity se puede integrar en una aplicación con solo unas pocas líneas de código. Por ejemplo, imagine este código en MainPage.xaml.cs, dentro de la clase MainPage (nota: supone 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();
}

La primera línea del GenerateActivityAsync() método anterior obtiene userActivityChannel de un usuario. Esta es la fuente en la que se publicarán las actividades de esta aplicación. La línea siguiente consulta el canal de una actividad denominada MainPage.

  • La aplicación debe asignar un nombre a las actividades de forma que se genere el mismo identificador cada vez que el usuario se encuentra en una ubicación determinada de la aplicación. Por ejemplo, si la aplicación está basada en páginas, use un identificador para la página; si se basa en su documento, use el nombre del documento (o un hash del nombre).
  • Si hay una actividad existente en la fuente con el mismo identificador, esa actividad se devolverá desde el canal con UserActivity.State establecido en Publicado). Si no hay ninguna actividad con ese nombre y se devuelve una nueva actividad con UserActivity.State establecida en Nuevo.
  • Las actividades se limitan a la aplicación. No es necesario preocuparse por el identificador de actividad que colisiona con identificadores en otras aplicaciones.

Después de obtener o crear UserActivity, especifique los otros dos campos obligatorios: UserActivity.VisualElements.DisplayTexty UserActivity.ActivationUri.

A continuación, guarde los metadatos de UserActivity llamando a SaveAsync y, por último, CreateSession, que devuelve userActivitySession. UserActivitySession es el objeto que podemos usar para administrar cuando el usuario está realmente comprometido con UserActivity. Por ejemplo, deberíamos llamar a Dispose() en UserActivitySession cuando el usuario sale de la página. En el ejemplo anterior, también llamamos Dispose()_currentActivity a antes de llamar a CreateSession(). Esto se debe a que hemos realizado _currentActivity un campo miembro de nuestra página y queremos detener cualquier actividad existente antes de iniciar la nueva (nota: ? es el operador condicional null que comprueba null antes de realizar el acceso de miembro).

Dado que, en este caso, ActivationUri es un esquema personalizado, también es necesario registrar el protocolo en el manifiesto de aplicación. Esto se hace en el archivo XML Package.appmanifest o mediante el diseñador.

Para realizar el cambio con el diseñador, haga doble clic en el archivo Package.appmanifest del proyecto para iniciar el diseñador, seleccione la pestaña Declaraciones y agregue una definición de protocolo . La única propiedad que debe rellenarse, por ahora, es Name. Debe coincidir con el URI especificado anteriormente, my-app.

Ahora es necesario escribir código para indicar a la aplicación qué hacer cuando un protocolo lo ha activado. Reemplazaremos el OnActivated método en App.xaml.cs para pasar el URI a la página principal, de la siguiente manera:

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();
}

Lo que hace este código es detectar si la aplicación se activó a través de un protocolo. Si fuera así, parece ver qué debe hacer la aplicación para reanudar la tarea para la que se está activando. Siendo una aplicación sencilla, la única actividad que reanuda esta aplicación es colocarla en la página secundaria cuando aparece la aplicación.

Usar tarjetas adaptables para mejorar la experiencia de escala de tiempo

Las actividades de usuario aparecen en Cortana y escala de tiempo. Cuando las actividades aparecen en escala de tiempo, se muestran mediante el marco de la tarjeta adaptable . Si no proporciona una tarjeta adaptable para cada actividad, la escala de tiempo creará automáticamente una tarjeta de actividad sencilla basada en el nombre y el icono de la aplicación, el campo de título y el campo de descripción opcional. A continuación se muestra un ejemplo de carga de tarjeta adaptable y la tarjeta que genera.

Una tarjeta adaptable]

Cadena JSON de carga de tarjeta adaptable de ejemplo:

{ 
  "$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 
        } 
      ] 
    } 
  ]
}

Agregue la carga de tarjetas adaptables como una cadena JSON a UserActivity de la siguiente manera:

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

Integración multiplataforma y de servicio a servicio

Si la aplicación se ejecuta multiplataforma (por ejemplo, en Android e iOS), o mantiene el estado de usuario en la nube, puede publicar UserActivities a través de Microsoft Graph. Una vez que la aplicación o el servicio se autentican con una cuenta Microsoft, solo se necesitan dos llamadas REST sencillas para generar objetos Activity e History , con los mismos datos que se describen anteriormente.

Resumen

Puedes usar la API UserActivity para hacer que la aplicación aparezca en Timeline y Cortana.

API de clave