Notificaciones en Wear OS

Las notificaciones en los relojes usan las mismas APIs y tienen la misma estructura que las notificaciones en los teléfonos.

Las notificaciones pueden aparecer en un reloj de dos maneras:

  1. Una app para dispositivos móviles crea una notificación y el sistema vincula automáticamente esa notificación con el reloj.
  2. Una app para wearables crea una notificación.

En ambos casos, usa la clase NotificationCompat.Builder para crear notificaciones. Cuando compilas notificaciones con la clase builder, el sistema se encarga de mostrarlas de forma correcta. Por ejemplo, cuando emites una notificación desde tu app para dispositivos móviles, cada notificación aparece como una tarjeta en el flujo de notificaciones.

Consulta el siguiente ejemplo para ver cómo se muestran las notificaciones.

notification-cards

Figura 1: La misma notificación como aparece en un teléfono y en un reloj

Usa una de las subclases NotificationCompat.Style para obtener los mejores resultados

Nota: Con RemoteViews, se quitan las notificaciones de diseños personalizados, y el wearable solo muestra el texto y los íconos.

Notificaciones recomendadas para wearables

Usa las notificaciones expandibles como punto de partida para todas las notificaciones, ya que son una excelente manera de atraer a los usuarios de wearables. El estado contraído se muestra en la bandeja de notificaciones para ofrecer una experiencia breve y fácil de ver. Si el usuario presiona la notificación, esta se expande, y se muestra una experiencia envolvente de contenido y acciones adicionales que se pueden desplazar.

Puedes crear una notificación expandible de la misma manera que lo harías en dispositivos móviles, usando cualquiera de las subclases NotificationCompat.Style. Por ejemplo, una notificación estándar que usa NotificationCompat.MessagingStyle se ve de la siguiente manera:

expandable-notification

Figura 2: Ejemplo de una notificación de MessagingStyle en Wear OS

Puedes ver que la notificación tiene varias acciones apiladas en la parte inferior del estado expandido.

Sugerencia: Si tus notificaciones incluyen una acción de "respuesta" (por ejemplo, para una app de mensajería), puedes mejorar su comportamiento. Por ejemplo, puedes habilitar las respuestas de entrada de voz directamente desde el wearable o las respuestas de texto predefinidas con setChoices(). Para obtener más información, consulta Cómo agregar el botón de respuesta.

Cómo evitar notificaciones duplicadas

De forma predeterminada, las notificaciones se comparten desde la aplicación complementaria para teléfonos a cualquier reloj vinculado. Esta es una opción muy útil si no tienes instalada una app para wearables.

Sin embargo, si compilas una app independiente para relojes y una aplicación complementaria para teléfonos, estas crean notificaciones duplicadas.

Wear OS proporciona una forma de detener las notificaciones duplicadas con las APIs de modo puente. Esto es especialmente importante para las apps en dispositivos que ejecutan Wear OS 5 o versiones posteriores, ya que algunas notificaciones que se pueden descartar en un dispositivo móvil no se pueden descartar en el dispositivo Wear OS. Para obtener más información, consulta Cómo unir opciones para las notificaciones.

Cómo agregar funciones específicas de wearables a una notificación

Si necesitas agregar funciones específicas de wearables a una notificación, puedes usar la clase NotificationCompat.WearableExtender para especificar las opciones. Para usar esta API, haz lo siguiente:

Nota: Si usas el framework de NotificationManager, algunas funciones de NotificationCompat.WearableExtender no funcionan, así que asegúrate de usar NotificationCompat.

En este ejemplo, se muestra cómo establecer una acción específica para Wear en la notificación y también establecer el ID de descarte. Cuando se descarta la notificación, también se descartan todas las que tengan el mismo ID de descarte en el reloj y el teléfono complementario. Para recuperar un ID de descarte, usa getDismissalId().

// This intent will be fired as a result of the user clicking the "Open on watch" action.
// However, it executes on the phone, not on the watch. Typically, the Activity should then use
// RemoteActivityHelper to then launch the correct activity on the watch.
val intent = Intent(context, LaunchOnWearActivity::class.java)
val wearPendingIntent = PendingIntent.getActivity(
    context,
    wearRequestCode,
    intent,
    PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)

val openOnWatchAction = NotificationCompat.Action.Builder(
    R.drawable.watch,
    "Open on watch",
    wearPendingIntent
)
    .build()

val wearableExtender = NotificationCompat.WearableExtender()
    // This action will only be shown on the watch, not on the phone.
    // Actions added to the Notification builder directly will not be shown on the watch,
    // because one or more actions are defined in the WearableExtender.
    .addAction(openOnWatchAction)
    // This synchronizes dismissals between watch and phone.
    .setDismissalId(chatId)

val notification = NotificationCompat.Builder(context, channelId)
    // ... set other fields ...
    .extend(wearableExtender)
    .build()

Cómo iniciar la app de teléfono desde un dispositivo wearable

Si usas notificaciones compartidas, cualquier notificación incluye automáticamente un botón para iniciar la app en el teléfono. Sin embargo, si usas una notificación local, creada en el reloj, sigue estos pasos para crear un botón que inicie la app en el teléfono:

  1. Crea un nuevo Activity que extienda ConfirmationActivity.
  2. Usa RemoteActivityHelper en el nuevo Activity para iniciar la app de Teléfono.
  3. Cuando compiles el Intent para iniciar el Activity desde la notificación, establece el elemento adicional EXTRA_ANIMATION_TYPE en OPEN_ON_PHONE_ANIMATION.
Este enfoque guía al usuario para que interactúe en su teléfono y cumple con los requisitos de la plataforma para iniciar procesos en segundo plano.

Nota: No puedes usar un BroadcastReceiver como destino de la acción de notificación.