De forma predeterminada, las notificaciones se comparten (modo puente) desde una app de un teléfono a cualquier reloj vinculado. Si compilas una app de reloj y esta también existe en un teléfono vinculado, es posible que los usuarios reciban notificaciones duplicadas, una generada por la app para teléfonos (una puente) y otra generada por la app de reloj. Wear OS incluye funciones para controlar cómo y cuándo se "combinan" las notificaciones.
Cómo evitar notificaciones duplicadas
Cuando creas notificaciones desde una fuente externa, como desde Firebase Cloud Messaging, tu app para dispositivos móviles y la app para wearables pueden mostrar sus propias notificaciones en el reloj. Para evitar este tipo de duplicación, tu app para wearables debe inhabilitar el modo puente de manera programática.
1. En la app para dispositivos móviles, utiliza etiquetas de modo puente cuando corresponda
Si quieres compartir algunas de las notificaciones creadas en tu app para dispositivos móviles con el reloj cuando la app para wearables se instale, configura etiquetas de modo puente.
Cómo establecer una etiqueta de modo puente
Para establecer una etiqueta de modo puente en una notificación, usa el método setBridgeTag(String)
, como se indica en la siguiente muestra de código:
val notification = NotificationCompat.Builder(context, channelId) // ... set other fields ... .extend( NotificationCompat.WearableExtender() .setBridgeTag("foo") ) .build()
2. En la app para wearables, inhabilita el modo puente
Cómo inhabilitar el modo puente para algunas notificaciones
Puedes inhabilitar el modo puente de forma dinámica y, de manera opcional, permitir algunas notificaciones en función de su etiqueta. Por ejemplo, para inhabilitar el modo puente para todas las notificaciones, excepto las etiquetadas como foo
, bar
o baz
, usa el objeto BridgingConfig
como se muestra en esta sección.
BridgingManager.fromContext(context).setConfig( BridgingConfig.Builder(context, false) .addExcludedTags(listOf("foo", "bar", "baz")) .build() )
Cómo inhabilitar el modo puente para todas las notificaciones (no recomendado)
Nota: No se recomienda inhabilitar el modo puente para todas las notificaciones, ya que la configuración del modo puente que se define en el manifiesto se implementa apenas se instala la app de reloj. Esto puede hacer que se pierdan las notificaciones si el usuario necesita abrir y configurar la app de reloj antes de recibirlas.
Para evitar que todas las notificaciones se compartan desde una app para teléfonos, usa la entrada <meta-data>
en el archivo de manifiesto de la app de reloj, como se muestra en el siguiente ejemplo:
<application> ... <!-- Beware this can have unintended consqequences before the user is signed-in --> <meta-data android:name="com.google.android.wearable.notificationBridgeMode" android:value="NO_BRIDGING" /> ... </application>
Nota: Cuando especificas una configuración de modo puente en el entorno de ejecución, se anula un parámetro relacionado con este modo en el archivo de manifiesto de Android.
3. Establece un ID de cancelación para sincronizar notificaciones similares en Wear OS y dispositivos móviles
Si evitas que se compartan notificaciones con la función de modo puente, las cancelaciones de notificaciones no se sincronizan en todos los dispositivos del usuario.
Sin embargo, si se crean notificaciones similares tanto en el dispositivo móvil como en el reloj, es aconsejable que descartes ambas notificaciones si el usuario descarta alguna de ellas.
En el NotificationCompat.WearableExtender
, puedes establecer un ID único global para que, cuando se descarte una notificación, también se descarten otras notificaciones con el mismo ID en los relojes vinculados.
La clase NotificationCompat.WearableExtender
tiene métodos que te permiten usar los IDs de cancelación, como se muestra en el siguiente ejemplo:
fun setDismissalId(dismissalId: String): WearableExtender fun getDismissalId(): String
Para sincronizar un descarte, usa el método setDismissalId()
. Para cada notificación, pasa un ID único global, como una string, cuando llames al método setDismissalId()
.
Cuando se descarta la notificación, las demás notificaciones con el mismo ID de cancelación también se descartan en los relojes y en el teléfono. Para recuperar un ID de cancelación, usa getDismissalId()
.
En el siguiente ejemplo, la sincronización de cancelaciones está habilitada porque se especifica un ID único global para una nueva notificación:
val notification = NotificationCompat.Builder(context, channelId) // ... set other fields ... .extend( NotificationCompat.WearableExtender() .setDismissalId("abc123") ) .build()
Nota: Los IDs de cancelación funcionan si el reloj está vinculado con un teléfono Android, pero no si está vinculado con un iPhone.
Cuando no se comparten las notificaciones
Las notificaciones no se comparten en los siguientes casos:
- Notificaciones solo locales configuradas con
Notification.Builder.setLocalOnly(boolean)
- Notificaciones recurrentes configuradas con
Notification.Builder.setOngoing(boolean)
oNotification.FLAG_ONGOING_EVENT
- Notificaciones que no se pueden borrar configuradas con
Notification.FLAG_NO_CLEAR
- Notificaciones en las que la app para wearables equivalente inhabilitó el modo puente de las notificaciones
Prácticas recomendadas para las notificaciones compartidas
Lleva tiempo enviar o quitar notificaciones compartidas desde un dispositivo wearable. Cuando diseñes tus notificaciones, asegúrate de evitar comportamientos imprevistos causados por esta latencia. Con los siguientes lineamientos, te aseguras de que tus notificaciones compartidas funcionen con las notificaciones asíncronas:
- Si cancelas una notificación en el teléfono, la notificación correspondiente en el reloj podría tardar un tiempo en cancelarse. Durante ese tiempo, el usuario podría enviar uno de los intents pendientes en esa notificación. Por este motivo, tu app debería recibir intents pendientes de notificaciones que haya cancelado. Por lo tanto, cuando canceles notificaciones, asegúrate de que los receptores de intents pendientes de esas notificaciones sean válidos.
- No canceles ni vuelvas a activar una pila completa de notificaciones al mismo tiempo. Solo cambia o quita las notificaciones que realmente se hayan modificado. De esta manera, se evita la latencia al actualizar el dispositivo wearable y se garantiza que tu app tenga un impacto mínimo en la duración de batería.
Consideraciones del diseño
Las notificaciones de Wear OS tienen sus propios lineamientos de diseño. Para obtener más información, consulta Lineamientos de diseño de Wear OS.