Apps siempre encendidas y modo ambiente del sistema

keywords: wear,ambient,alwayson

Wear OS controla automáticamente el cambio al modo de bajo consumo de una app activa cuando un usuario deja de usar el reloj. Eso se denomina modo ambiente del sistema. Si el usuario vuelve a interactuar con el reloj dentro de un período determinado, Wear OS lo lleva a la última app que usó.

Para casos de uso específicos, como un usuario que desea ver la frecuencia cardíaca y el ritmo durante una carrera, también puedes controlar lo que se muestra en el modo ambiente de bajo consumo. Las apps para Wear OS que se ejecutan en los modos interactivo y ambiente se denominan apps siempre activas.

Hacer que una app sea visible constantemente afecta la duración de la batería, por lo que debes tener en cuenta ese impacto cuando agregues esta función a tu app.

Cómo configurar tu proyecto

Para admitir el modo ambiente, sigue estos pasos:

  1. Crea o actualiza tu proyecto según la configuración de la página Cómo crear y ejecutar una app para wearables.
  2. Agrega el permiso WAKE_LOCK al archivo de manifiesto de Android:
<uses-permission android:name="android.permission.WAKE_LOCK" />

Cómo habilitar el modo siempre activo

Para usar la clase AmbientLifecycleObserver, haz lo siguiente:

  1. Implementa la interfaz AmbientLifecycleObserver.AmbientLifecycleCallback, como en el siguiente ejemplo. En esta etapa, los métodos están vacíos, pero más adelante en la guía se proporcionan detalles sobre los cambios que debes realizar en la visualización para entrar al modo ambiente y salir de él.

    Kotlin

    val ambientCallback = object : AmbientLifecycleObserver.AmbientLifecycleCallback {
        override fun onEnterAmbient(ambientDetails: AmbientLifecycleObserver.AmbientDetails) {
        // ... Called when moving from interactive mode into ambient mode.
        }
    
        override fun onExitAmbient() {
        // ... Called when leaving ambient mode, back into interactive mode.
        }
    
        override fun onUpdateAmbient() {
        // ... Called by the system in order to allow the app to periodically
        // update the display while in ambient mode. Typically the system will
        // call this every 60 seconds.
        }
    }
  2. Crea un AmbientLifecycleObserver y registra el observador. Por lo general, se usa en onCreate() o en el elemento componible de nivel superior si se usa Compose para Wear OS, para permitir que se habilite el comportamiento siempre activo durante todo el ciclo de vida de la actividad.

    Kotlin

    private val ambientObserver = AmbientLifecycleObserver(activity, callback)
    
    override fun onCreate(savedInstanceState: Bundle) {
      super.onCreate(savedInstanceState)
      lifecycle.addObserver(observer)
    
      // ...
    }
  3. Quita el observador llamando a removeObserver() cuando ya no se requiera el comportamiento siempre activo. Por ejemplo, puedes llamar a este método en el método onDestroy() de tu actividad.

Las apps siempre activas pueden pasar a segundo plano

A partir de Wear OS 5, el sistema mueve las apps siempre activas al segundo plano después de que sean visibles en el modo ambiente durante un período determinado. Los usuarios pueden configurar el tiempo de espera en la configuración del sistema.

Si tu app siempre activa muestra información sobre una tarea en curso del usuario, como la reproducción de música o una sesión de entrenamiento, te recomendamos que mantengas visible la actividad en curso hasta que finalice la tarea. Para ello, usa la API de Ongoing Activity para publicar una notificación continua vinculada a tu actividad siempre activa.

Para que el sistema reconozca la actividad en curso, el intent de toque de la notificación en curso debe apuntar a tu actividad siempre activa, como se muestra en el siguiente fragmento de código:

// Create a pending intent that point to your always-on activity
val touchIntent =
    PendingIntent.getActivity(
        context,
        0,
        Intent(context, MyAlwaysOnActivity::class.java),
        PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
    )

val notificationBuilder =
    NotificationCompat.Builder(this, CHANNEL_ID)
    // ...
    .setOngoing(true)

val ongoingActivity =
    OngoingActivity.Builder(
        applicationContext, NOTIFICATION_ID, notificationBuilder
    )
    // ...
    .setTouchIntent(touchIntent)
    .build()

ongoingActivity.apply(applicationContext)

notificationManager.notify(
    NOTIFICATION_ID,
    notificationBuilder.build()
)

Cómo modificar la apariencia visual en el modo ambiente

De forma predeterminada, cuando se implementa el comportamiento siempre activo, la pantalla no cambia su apariencia cuando el reloj entra en el modo ambiente. Puedes modificar este comportamiento anulando los métodos en AmbientLifecycleCallback.

Para ahorrar energía, haz lo siguiente:

  • Ilumina menos píxeles y deja la mayor parte de la pantalla negra. Considera mostrar solo la información crítica en el modo ambiente y proporciona más detalles cuando el usuario entre en el modo interactivo.
  • Ajusta el contenido para que se actualice con menos frecuencia. Por ejemplo, muestra los cronómetros al minuto y no al segundo más cercano.
  • En el objeto AmbientDetails que se pasa a onEnterAmbient(), haz lo siguiente:
    • Si se configura deviceHasLowBitAmbient, inhabilita el suavizado de contorno siempre que sea posible.
    • Si se configura burnInProtectionRequired, cambia la visualización de forma periódica y evita las áreas blancas sólidas.

Cuando uses Compose para Wear OS, te recomendamos que utilices estos métodos de devolución de llamada para actualizar el estado, lo que permite que el sistema recomponga tu IU de manera adecuada.

Para ver un ejemplo de cómo se puede lograr esto, consulta la muestra de ejercicio basada en Compose en GitHub, que usa el elemento componible AmbientAware de la biblioteca Horologist.