Always-on-Apps und Inaktivmodus des Systems

Wear OS wechselt automatisch in den Energiesparmodus für eine aktive App, wenn der Nutzer seine Smartwatch nicht mehr verwendet. Dies wird als System-Inaktivmodus bezeichnet. Die App wird fortgesetzt, nachdem der Nutzer mit der Smartwatch interagiert hat, wenn eine der folgenden Bedingungen erfüllt ist:

  • Die Nutzerinteraktion erfolgt innerhalb eines bestimmten Zeitraums (vor Ablauf des Zeitlimits).
  • Die App deklariert und hat eine laufende Aktivität gestartet.

Für bestimmte Anwendungsfälle, z. B. wenn ein Nutzer während eines Laufs seine Herzfrequenz und sein Tempo sehen möchte, können Sie auch festlegen, was im Inaktivitätsmodus des Systems angezeigt wird. Wear OS-Apps, die sowohl im Inaktiv- als auch im interaktiven Modus ausgeführt werden, werden als Always-On-Apps bezeichnet.

Wenn eine App ständig sichtbar ist, wirkt sich das auf die Akkulaufzeit aus. Berücksichtigen Sie dies, wenn Sie diese Funktion in Ihre App einbinden.

Projekt konfigurieren

So unterstützen Sie den Inaktivmodus:

  1. Erstellen oder aktualisieren Sie Ihr Projekt anhand der Konfigurationen auf der Seite Wearable-App erstellen und ausführen.
  2. (Nur für Wear OS 4 oder niedriger erforderlich) Fügen Sie der Android-Manifestdatei die Berechtigung WAKE_LOCK hinzu:
<uses-permission android:name="android.permission.WAKE_LOCK" android:maxSdkVersion="33"/>

Always-on-Displaymodus aktivieren

Ab Wear OS 6 sind Apps, für die targetSdkVersion auf „36“ oder höher festgelegt ist, standardmäßig immer aktiv. Diese Apps bleiben während des Inaktivitätsmodus des Systems für einen begrenzten Zeitraum ohne Konfiguration sichtbar. Wenn die targetSdkVersion Ihrer App unter 36 liegt oder Ihre App auf Wear OS 5 oder niedriger ausgeführt werden muss, verwenden Sie die Klasse AmbientLifecycleObserver, um Ihre App immer aktiv zu halten.

Mit der Klasse „AmbientLifecycleObserver“ auf Ereignisse im Inaktivmodus reagieren

Apps können auch die Klasse AmbientLifecycleObserver verwenden, um direkt auf Ereignisse im Ruhemodus zu reagieren:

  1. Implementieren Sie die AmbientLifecycleObserver.AmbientLifecycleCallback-Schnittstelle, wie im folgenden Beispiel gezeigt. In dieser Phase sind die Methoden leer. Im weiteren Verlauf des Leitfadens erfahren Sie jedoch, welche Änderungen Sie an der Visualisierung vornehmen sollten, um den Inaktivmodus zu aktivieren und zu deaktivieren.

    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. Erstellen Sie eine AmbientLifecycleObserver und registrieren Sie den Beobachter. Normalerweise wird dies in onCreate() oder im Composable auf oberster Ebene verwendet, wenn Compose für Wear OS verwendet wird, damit das „Immer an“-Verhalten während des gesamten Lebenszyklus der Aktivität aktiviert werden kann.

    Kotlin

    private val ambientObserver = AmbientLifecycleObserver(activity, callback)
    
    override fun onCreate(savedInstanceState: Bundle) {
      super.onCreate(savedInstanceState)
      lifecycle.addObserver(observer)
    
      // ...
    }
  3. Entfernen Sie den Beobachter, indem Sie removeObserver() aufrufen, wenn das „Immer an“-Verhalten nicht mehr erforderlich ist. Sie können diese Methode beispielsweise in der Methode onDestroy() Ihrer Aktivität aufrufen.

Zeittext mit dem Widget „ZeitText“ aktualisieren

Ab Wear OS 6 berücksichtigt das TimeText-Widget den Inaktivmodus. Wenn Ihre App im Ruhemodus nur alle Minuten einen Zeittext aktualisieren muss, können Sie einfach das Widget TimeText verwenden, ohne AmbientLifecycleObserver zu verwenden.

Immer aktive Apps können in den Hintergrund verschoben werden

Ab Wear OS 5 werden Always-On-Apps vom System in den Hintergrund verschoben, nachdem sie für einen bestimmten Zeitraum im Inaktivmodus sichtbar waren. Nutzer können die Zeitüberschreitung in den Systemeinstellungen konfigurieren.

Wenn Ihre App, die immer aktiv ist, Informationen zu einer laufenden Nutzeraufgabe anzeigt, z. B. zur Musikwiedergabe oder zu einer Trainingseinheit, sollten Sie die laufende Aktivität sichtbar lassen, bis die Aufgabe beendet ist. Verwenden Sie dazu die Ongoing Activity API, um eine fortlaufende Benachrichtigung zu posten, die mit Ihrer durchgehend aktiven Aktivität verknüpft ist.

Damit das System die laufende Aktivität erkennt, muss die Touch-Intention der laufenden Benachrichtigung auf Ihre aktive Aktivität verweisen, wie im folgenden Code-Snippet dargestellt:

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

Nutzerfreundlichkeit im Bildschirmschonermodus anpassen

Wenn Sie die Funktion „Always-On“ implementieren, ändert sich das Display standardmäßig nicht, wenn die Smartwatch in den Inaktivmodus wechselt. Sie können dieses Verhalten ändern, indem Sie die Methoden im AmbientLifecycleCallback überschreiben.

So sparen Sie Strom:

  • Weniger Pixel beleuchten. Es empfiehlt sich, im Bildschirmschonermodus nur wichtige Informationen anzuzeigen und mehr Details zu liefern, wenn der Nutzer den interaktiven Modus aktiviert.
  • Lassen Sie mindestens 85% des Bildschirms schwarz, entfernen Sie Füllungen und verwenden Sie Umrisse für Schaltflächen und große Symbole.
  • Vermeiden Sie überflüssige Informationen wie nicht funktionales Branding und Hintergrundbilder.
  • Die Elemente müssen im aktiven und im Always-On-Modus an derselben Position bleiben und die Uhrzeit muss immer angezeigt werden.
  • Passen Sie alle Inhalte an weniger häufige Aktualisierungen an. Beispielsweise werden Timer auf die nächste Minute statt auf die nächste Sekunde genau angezeigt.
  • Entfernen oder zeigen Sie Platzhalter-UIs für alphanumerische Inhalte, die häufig aktualisiert werden, z. B. Entfernung oder Zeit.
  • Entfernen Sie Fortschrittsanzeigen, die häufig aktualisiert werden, z. B. für Countdown-Ringe und Mediensitzungen.
  • Wenn der Nutzer zuvor einen Konfigurations- oder Einstellungsbildschirm in Ihrer App aufgerufen hat, sollten Sie ihm stattdessen einen relevanteren Bildschirm anzeigen.
  • Im AmbientDetails-Objekt, das an onEnterAmbient() übergeben wird:
    • Wenn deviceHasLowBitAmbient festgelegt ist, deaktivieren Sie nach Möglichkeit das Anti-Aliasing.
    • Wenn burnInProtectionRequired festgelegt ist, verschieben Sie die Visualisierung regelmäßig und vermeiden Sie durchgehend weiße Bereiche.
  • Vermeiden Sie es, im Bildschirmschoner eine kontinuierliche Animation auszuführen. Ab Wear OS 5.1 werden Animationen im Inaktivmodus möglicherweise nicht mehr ausgeführt.

Checkliste für die kontinuierliche Anzeige

Es kann Situationen geben, in denen Sie das Display optimal steuern möchten, wenn sich das Gerät in verschiedenen Status befindet. Beispielsweise kann eine Trainings-App verhindern, dass das Zifferblatt während eines Trainings auf dem Display angezeigt wird. Gehen Sie in diesen Fällen so vor:

  1. Implementieren Sie die AmbientLifecycleObserver.AmbientLifecycleCallback-Schnittstelle.
  2. Erstellen Sie ein neues Layout für den Energiesparmodus, das verwendet werden soll, wenn sich das Gerät im System-Inaktivitätsmodus befindet.
  3. Implementieren Sie für die Dauer des Trainings eine laufende Aktivität.

Ein Beispiel dafür ist das Beispiel für eine Compose-basierte Übung auf GitHub, in dem die AmbientAware-Komponente aus der Horologist-Bibliothek verwendet wird.