Compartir vía


Continuar la actividad del usuario, incluso en todos los dispositivos

En este tema se describe cómo ayudar a los usuarios a reanudar lo que estaban haciendo 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 actividad sincronizado en sus dispositivos Windows a través de su Cuenta Microsoft (MSA) ya no tendrán la opción de cargar nueva actividad en Cronología. Seguirán siendo capaces de usar la escala de tiempo y ver su historial de actividad (información sobre aplicaciones recientes, sitios web y archivos) en su PC local. Las cuentas conectadas a AAD no se verán afectadas.

Actividades y escala de tiempo del usuario

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, crear una actividad de usuario hace que esa actividad aparezca en la línea de tiempo de Windows y en la función de Cortana "Continuar donde lo dejé". La función Timeline es una vista de tareas enriquecida que aprovecha las actividades del usuario para mostrar una perspectiva cronológica de lo que ha estado haciendo. También puede incluir lo que has estado trabajando en todos los dispositivos.

imagen de la línea 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 un UserActivity como algo específico en el que el usuario estaba trabajando en la aplicación. Por ejemplo, si está utilizando un lector RSS, una UserActivity podría ser el feed que está leyendo. Si estás jugando un juego, el UserActivity podría ser el nivel que estás jugando. Si estás utilizando una aplicación de música, el UserActivity podría ser la lista de reproducción que estás escuchando. Si está trabajando en un documento, el UserActivity podría ser donde dejó de trabajar en él, etc. En resumen, un UserActivity representa un destino dentro de la aplicación para que el usuario reanude lo que estaba haciendo.

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

Agregar actividades de usuario a la aplicación

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

  1. El ActivationUri de se usa para reanudar la aplicación con un contexto específico. Normalmente, este vínculo adopta 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 toma la forma de datos https://schema.org.

Para agregar una UserActivity a tu aplicación:

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

Un 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 método GenerateActivityAsync() anterior obtiene el 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 tal manera 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 el 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 asignado a New.
  • Las actividades se limitan a la aplicación. No tienes que preocuparte por que tu ID de actividad choque con los IDs en otras aplicaciones.

Después de obtener o crear la actividad de usuario , defina los dos campos obligatorios: UserActivity.VisualElements.DisplayTexty UserActivity.ActivationUri.

A continuación, guarde los metadatos de UserActivity llamando a SaveAsyncy, por último, a CreateSession, que devuelve un UserActivitySession. El UserActivitySession es el objeto que se puede usar para administrar cuándo el usuario está realmente involucrado con el UserActivity. Por ejemplo, deberíamos llamar a en el UserActivitySession de cuando el usuario abandona la página. En el ejemplo anterior, también llamamos a Dispose() en _currentActivity antes de llamar a CreateSession(). Esto se debe a que hemos declarado _currentActivity como un campo miembro de nuestra página, y queremos detener cualquier actividad que esté en progreso antes de comenzar una nueva (nota: el ? es el operador condicional de nulidad que verifica la nulidad antes de realizar el acceso al miembro).

Dado que, en este caso, el 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 de su 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 "Nombre". 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 método OnActivated 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 es así, se verifica qué debe hacer la aplicación para retomar la tarea para la cual está siendo activada. Siendo una aplicación sencilla, la única actividad que realiza esta aplicación es llevarte a la página secundaria cuando se inicia la aplicación.

Usar tarjetas adaptativas para mejorar la experiencia de la línea de tiempo

Las actividades de usuario aparecen en Cortana y la línea de tiempo. Cuando las actividades aparecen en la Línea de tiempo, las mostramos utilizando el marco de Tarjeta Adaptable. Si no proporciona una tarjeta adaptable para cada actividad, la Línea de tiempo creará automáticamente una tarjeta de actividad simple 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 al 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 entre servicios

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 activity y objetos History, con los mismos datos que se describen anteriormente.

Resumen

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

APIs clave