App sempre attive e modalità Ambient di sistema

parole chiave: wear,ambient,alwayson

Wear OS gestisce automaticamente il passaggio alla modalità a basso consumo per un'app attiva quando un utente non utilizza più lo smartwatch. Questa è la modalità Ambient del sistema. Se l'utente interagisce di nuovo con l'orologio entro un determinato periodo di tempo, Wear OS lo riporta all'app da dove aveva interrotto.

Per casi d'uso specifici, ad esempio un utente che vuole vedere la frequenza cardiaca e il ritmo durante una corsa, puoi anche controllare cosa viene visualizzato nella modalità Ambient a basso consumo. Le app Wear OS in esecuzione sia in modalità Ambient che interattiva sono chiamate app sempre attive.

La visibilità costante di un'app influisce sulla durata della batteria, quindi prendi in considerazione questo impatto quando aggiungi questa funzionalità alla tua app.

Configura il progetto

Per supportare la modalità Ambient:

  1. Crea o aggiorna il progetto in base alle configurazioni nella pagina Creare e eseguire un'app per dispositivi indossabili.
  2. Aggiungi l'autorizzazione WAKE_LOCK al file Android Manifest:
<uses-permission android:name="android.permission.WAKE_LOCK" />

Attivare la modalità sempre attiva

Per utilizzare la classe AmbientLifecycleObserver:

  1. Implementa l'interfaccia AmbientLifecycleObserver.AmbientLifecycleCallback, come nell'esempio seguente. In questa fase, i metodi sono vuoti, ma più avanti nella guida vengono forniti dettagli sulle modifiche che devi apportare alla visualizzazione per entrare e uscire dalla modalità Ambient.

    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 e registra l'osservatore. In genere, questo viene utilizzato in onCreate() o nel composable di primo livello se utilizzi Compose per Wear OS per consentire l'attivazione del comportamento sempre attivo durante tutto il ciclo di vita dell'attività.

    Kotlin

    private val ambientObserver = AmbientLifecycleObserver(activity, callback)
    
    override fun onCreate(savedInstanceState: Bundle) {
      super.onCreate(savedInstanceState)
      lifecycle.addObserver(observer)
    
      // ...
    }
  3. Rimuovi l'osservatore chiamando removeObserver() quando il comportamento sempre attivo non è più necessario. Ad esempio, puoi chiamare questo metodo nel metodo onDestroy() della tua attività.

Le app sempre attive possono passare in background

A partire da Wear OS 5, il sistema sposta le app sempre attive in background dopo che sono state visibili in modalità Ambient per un determinato periodo di tempo. Gli utenti possono configurare il timeout nelle impostazioni di sistema.

Se la tua app sempre attiva mostra informazioni su un'attività in corso dell'utente, ad esempio la riproduzione di musica o una sessione di allenamento, ti consigliamo di mantenere visibile l'attività in corso fino al termine dell'attività. A tale scopo, utilizza l'API Attività in corso per pubblicare una notifica in corso collegata alla tua attività sempre attiva.

Affinché il sistema riconosca l'attività in corso, l'intent tocco della notifica in corso deve puntare all'attività sempre attiva, come mostrato nel seguente snippet di codice:

// 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()
)

Modificare l'aspetto visivo in modalità Ambient

Per impostazione predefinita, quando viene implementato il display sempre attivo, lo schermo non cambia aspetto quando lo smartwatch entra in modalità Ambient. Puoi modificare questo comportamento ignorando i metodi in AmbientLifecycleCallback.

Per risparmiare energia:

  • Illumina meno pixel e lascia la maggior parte dello schermo nera. Valuta la possibilità di mostrare solo le informazioni fondamentali in modalità Ambient e fornire maggiori dettagli quando l'utente entra in modalità interattiva.
  • Modifica i contenuti in modo che vengano aggiornati meno di frequente. Ad esempio, mostra i timer al minuto più vicino anziché al secondo più vicino.
  • Nell'oggetto AmbientDetails passato a onEnterAmbient():
    • Se è impostato deviceHasLowBitAmbient, disattiva l'anti-aliasing, se possibile.
    • Se è impostato burnInProtectionRequired, sposta la visualizzazione periodicamente ed evita aree bianche solide.

Quando utilizzi Compose per Wear OS, ti consigliamo di utilizzare questi metodi di callback per aggiornare lo stato, in modo che il sistema possa ricomporre l'interfaccia utente in modo appropriato.

Per un esempio di come è possibile ottenere questo risultato, consulta l' Esercizio di esempio basato su compose su GitHub, che utilizza il composable AmbientAware della libreria Horologist.