Compartir a través de


Continuar la actividad del usuario, incluso en diferentes 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 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 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 característica Pick up 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 que UserActivity es un elemento específico con el que el usuario estaba trabajando en la aplicación. Por ejemplo, si usa un lector RSS, un elemento userActivity podría ser el feed que está leyendo. Si está jugando con un juego, UserActivity podría ser el nivel en el que está jugando. Si está escuchando una aplicación de música, UserActivity podría ser la lista de música que está escuchando. Si está trabajando en un documento, UserActivity podría ser el punto donde dejó de trabajar, 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 una 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 ese elemento UserActivity a lo largo del tiempo, se registrarán varios registros de historial sobre él.

Agregar actividades de usuario a la aplicación

UserActivity es la unidad de involucració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://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 datos https://schema.org.

Para agregar un elemento UserActivity a la aplicación:

  1. Genere objetos UserActivity cuando el contexto del usuario cambie en 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 elemento UserActivity.

Puede integrar un elemento UserActivity 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. Este es el feed en la que se publicarán las actividades de la 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 id. 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; en cambio, si se basa en un 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 establecida en UserActivity.State Nuevo.
  • Las actividades se limitan a la aplicación. No es necesario preocuparse por el id. de actividad que entra en conflicto con los id. 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 userActivity llamando a SaveAsync y, por último, CreateSession, que devuelve userActivitySession. UserActivitySession es el objeto que puede usar para administrar el momento en que el usuario esté usando realmente UserActivity. Por ejemplo, deberíamos llamar a Dispose() en UserActivitySession cuando el usuario salga de la página. En el ejemplo anterior, también llamamos Dispose() a en _currentActivity 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; a continuación, 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.

A continuación, es necesario escribir algo de código para indicar a la aplicación qué hacer cuando un protocolo la haya 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 es así, podrá ver qué hará la aplicación para reanudar la tarea para la que se está activando. Como es una aplicación sencilla, la única actividad que se reanuda es llevarle a 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 tarjeta adaptable. Si no proporciona una tarjeta adaptable para cada actividad, la escala 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 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 entre servicios

Si la aplicación se ejecuta multiplataforma (por ejemplo, en Android e iOS), o mantiene el estado del 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