Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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.
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
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.
- 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
). - VisualElements expone una clase que permite al usuario identificar visualmente una actividad con un título, una descripción o elementos de tarjeta adaptable.
- 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:
- 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.)
- Poblar los objetos UserActivity con el mínimo conjunto de campos obligatorios: ActivityId, ActivationUri, y UserActivity.VisualElements.DisplayText.
- 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 conUserActivity.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.DisplayText
y 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 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.
]
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.
- Obtenga más información sobre el UserActivity API
- Consulte el código de ejemplo de .
- Consulte tarjetas adaptables más sofisticadas.
- Publique un UserActivity desde iOS, Android o desde su servicio web a través de Microsoft Graph.
- Obtenga más información sobre Project Rome en GitHub.