Apps siempre encendidas y modo ambiente del sistema

Wear OS controla automáticamente el cambio al modo de bajo consumo de una app activa cuando un usuario no está activo usando el reloj. Eso se denomina modo ambiente del sistema. Si el usuario interactúa con de nuevo dentro de un período determinado, Wear OS lleva al usuario nuevamente a la app en la que que quedaron.

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

Hacer que una app sea visible constantemente afecta la duración de la batería, así que ten en cuenta ese impacto cuando agregues esta función a tu aplicación.

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 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 utilizar la AmbientLifecycleObserver, haz lo siguiente:

  1. Implementa el 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 de los cambios debes asegurarte de realizar 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, este se usará en onCreate() o en el elemento componible de nivel superior si usas Compose para Wear OS Permiten que el comportamiento siempre activo se habilite 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 se active la función comportamiento ya no es necesario. 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 a segundo plano después estarán visibles en el modo ambiente durante un período determinado. Los usuarios pueden ajustar el tiempo de espera en la configuración del sistema.

Si tu app siempre activa muestra información sobre una tarea del usuario en curso, como reproducción de música o una sesión de entrenamiento, puede que quieras mantener la actividad en curso visible 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, la intent táctil de la notificación 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 modo siempre activo, la pantalla no cambia su cuando el reloj entra en el modo ambiente. Puedes modificar este su comportamiento anulando los métodos AmbientLifecycleCallback

Para ahorrar energía, haz lo siguiente:

  • Ilumina menos píxeles y deja la mayor parte de la pantalla negra. Reflexiona mostrando solo la información crítica en el modo ambiente y proporcionar detalle cuando el usuario ingresa al modo interactivo.
  • Ajusta el contenido para que se actualice con menos frecuencia. Por ejemplo, mostrar temporizadores al minuto y no al segundo más cercano.
  • En AmbientDetails que se pasa a onEnterAmbient():
    • Si se configura deviceHasLowBitAmbient, inhabilita el suavizado de contorno siempre que sea posible.
    • Si se establece burnInProtectionRequired, cambia la visualización periódicamente y evita las áreas blancas sólidas.

Cuando uses Compose para Wear OS, te recomendamos que uses estos métodos de devolución de llamada para actualizar el estado, lo que le permite al sistema recomponer tu la IU de forma adecuada.

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