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 y escala de tiempo del usuario

Nuestra hora cada día se distribuye entre varios dispositivos. Podríamos usar nuestro teléfono en el bus, un equipo durante el día y, a continuación, un teléfono o tableta por la noche. A partir de Windows 10 compilación 1803 o posterior, la creación de una actividad de usuario hace que esa actividad aparezca en la escala de tiempo de Windows y en la característica Pick up (Pick up) de Cortana donde la dejo. La escala de tiempo es una vista de tareas enriquez 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.

Windows de escala de tiempo

Del mismo modo, vincular el teléfono al equipo Windows permite continuar con lo que estaba haciendo anteriormente en el dispositivo iOS o Android.

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

Cuando se interactúa con un objeto UserActivity mediante una llamada 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 vuelve a interactuar con esa UserActivity con el tiempo, se registran varios registros de historial para ella.

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 adopta la forma de controlador de protocolo para un esquema (por ejemplo, "my-app://page2?action=edit") o de appUriHandler (por ejemplo, http://constoso.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 Adaptive Card.
  3. Por último, Contenido es donde puede almacenar los metadatos de la actividad que se pueden 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 cambia dentro de la aplicación (por ejemplo, navegación por páginas, nuevo nivel de juego, etc.)
  2. Rellene los objetos UserActivity con el conjunto mínimo de campos necesarios: ActivityId, ActivationUriy UserActivity.VisualElements.DisplayText.
  3. Agregue un controlador de esquema personalizado a la aplicación para que userActivity pueda volver a activarlo.

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 GenerateActivityAsync() Esta es la fuente en la que se publicarán las actividades de esta aplicación. La siguiente línea consulta el canal de una actividad denominada MainPage .

  • La aplicación debe llamar 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 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 UserActivity.State. Si no hay ninguna actividad con ese nombre y se devuelve una nueva actividad con UserActivity.State establecido en UserActivity.State.
  • Las actividades están en el ámbito de la aplicación. No es necesario preocuparse por el identificador de actividad que colisiona con los identificadores de otras aplicaciones.

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

A continuación, guarde los metadatos de UserActivity mediante una llamada a SaveAsyncy, por último, CreateSession, que devuelve userActivitySession. UserActivitySession es el objeto que se puede usar para administrar cuando el usuario está realmente comprometido con UserActivity. Por ejemplo, debemos llamar a Dispose() en Dispose() cuando el usuario salga de la página. En el ejemplo anterior, también llamamos Dispose() a en antes de llamar a _currentActivityCreateSession() . Esto se debe a que creamos un campo de miembro de nuestra página y queremos detener cualquier actividad existente antes de iniciar la nueva (nota: es el operador condicional null que comprueba si es NULL antes de realizar el acceso a los _currentActivity? miembros). _currentActivity

Puesto que, en este caso, es un esquema personalizado, también es necesario registrar ActivationUri 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 decir a la aplicación qué hacer cuando se activa mediante un protocolo. Invalidaremos el método en App.xaml.cs para pasar el OnActivated URI a la página principal, como se muestra a continuación:

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í, busca ver qué debe hacer la aplicación para reanudar la tarea para la que se está activando. Al ser una aplicación sencilla, la única actividad que reanuda esta aplicación es colocarle en la página secundaria cuando la aplicación aparece.

Uso de Tarjetas adaptables para mejorar la experiencia de la escala de tiempo

Las actividades del usuario aparecen en Cortana y escala de tiempo. Cuando las actividades aparecen en la escala de tiempo, se muestran mediante el marco de tarjeta adaptable. Si no proporciona una tarjeta adaptable para cada actividad, Timeline 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]

Ejemplo de cadena JSON de carga de tarjeta adaptable:

{ 
  "$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 Tarjetas adaptables carga útil como una cadena JSON a UserActivity de la siguiente forma:

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 de actividad e historial, con los mismos datos que se han descrito anteriormente.

Resumen

Puede usar UserActivity API para que la aplicación aparezca en timeline y Cortana.

API clave