Zawsze włączone aplikacje i tryb nieaktywny systemu

Gdy użytkownik przestanie korzystać z zegarka, Wear OS automatycznie przełączy aktywną aplikację w tryb niskiego poboru mocy. Jest to tzw. tryb dźwięków otoczenia. Aplikacja wznawia działanie po tym, jak użytkownik wejdzie w interakcję z zegarkiem, jeśli spełniony jest któryś z tych warunków:

  • Interakcja użytkownika występuje w określonym przedziale czasu (przed upływem limitu czasu).
  • Aplikacja zadeklarowała i rozpoczęła trwale trwającą aktywność.

W przypadku konkretnych zastosowań – na przykład gdy użytkownik chce wyświetlać tętno i tempo podczas biegu – możesz też kontrolować, co ma być wyświetlane w trybie ambient. Aplikacje na Wear OS, które działają w trybie zwykłym i interaktywnie, nazywane są aplikacją zawsze włączoną.

Utrzymywanie aplikacji w stanie widocznym wpływa na czas pracy na baterii, dlatego weź to pod uwagę, dodając tę funkcję do aplikacji.

Konfigurowanie projektu

Aby włączyć tryb nieaktywny:

  1. Utwórz lub zaktualizuj projekt na podstawie konfiguracji na stronie Tworzenie i uruchamianie aplikacji na urządzenie do noszenia.
  2. (wymagane tylko w Wear OS 4 lub starszym) Dodaj uprawnienie WAKE_LOCK do pliku manifestu Androida:
<uses-permission android:name="android.permission.WAKE_LOCK" android:maxSdkVersion="33"/>

Włączanie trybu zawsze włączonego

Począwszy od Wear OS 6 aplikacje z wartością targetSdkVersion równą 36 lub większą są domyślnie zawsze włączone. Te aplikacje pozostają widoczne w trybie ambient przez ograniczony czas bez konieczności konfiguracji. Jeśli wartość targetSdkVersion Twojej aplikacji jest mniejsza niż 36 lub jeśli aplikacja musi działać na Wear OS 5 lub starszej wersji, użyj klasy AmbientLifecycleObserver, aby aplikacja była zawsze włączona.

Odpowiadanie na zdarzenia trybu nieaktywnego za pomocą klasy AmbientLifecycleObserver

Aplikacje mogą też używać klasy AmbientLifecycleObserver, aby bezpośrednio reagować na zdarzenia w trybie otoczenia:

  1. Zaimplementuj interfejs AmbientLifecycleObserver.AmbientLifecycleCallback, jak w tym przykładzie. Na tym etapie metody są puste, ale w dalszej części tego przewodnika znajdziesz szczegółowe informacje o tym, jakie zmiany należy wprowadzić w wizualizacji, aby przejść do trybu nieaktywnego i z niego wyjść.

    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. Utwórz AmbientLifecycleObserver i zarejestruj obserwatora. Zazwyczaj jest to używane w komponencie onCreate() lub w komponencie najwyższego poziomu, jeśli używasz Compose na Wear OS, aby umożliwić działanie funkcji zawsze włączonej przez cały czas trwania aktywności.

    Kotlin

    private val ambientObserver = AmbientLifecycleObserver(activity, callback)
    
    override fun onCreate(savedInstanceState: Bundle) {
      super.onCreate(savedInstanceState)
      lifecycle.addObserver(observer)
    
      // ...
    }
  3. Usuń obserwatora, wywołując funkcję removeObserver(), gdy zachowanie „zawsze włączone” nie jest już wymagane. Możesz na przykład wywołać tę metodę w metodzie onDestroy() swojej aktywności.

Aktualizowanie tekstu czasu za pomocą widżetu TimeText

Od wersji 6 systemu Wear OS widżet TimeText obsługuje tryb nieaktywny. Jeśli aplikacja musi aktualizować tekst z godzinami tylko co minutę w trybie ambient, możesz użyć widżetu TimeText bez korzystania z elementu AmbientLifecycleObserver.

Aplikacje zawsze włączone mogą działać w tle

Począwszy od Wear OS 5 system przenosi aplikacje zawsze aktywne na drugi plan po tym, jak są widoczne w trybie ambient przez określony czas. Użytkownicy mogą skonfigurować limit czasu w ustawieniach systemu.

Jeśli aplikacja zawsze włączona wyświetla informacje o bieżącym zadaniu użytkownika, np. odtwarzaniu muzyki lub sesji treningowej, możesz chcieć zachować widoczność bieżącej aktywności do czasu zakończenia zadania. Aby to zrobić, użyj interfejsu Ongoing Activity API, aby opublikować powiadomienie, które jest połączone z Twoją stałą aktywnością.

Aby system mógł rozpoznać trwającą aktywność, intencja dotknięcia powiadomienia musi wskazywać na aktywność zawsze włączoną, jak pokazano w tym fragmencie kodu:

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

Zmienianie wrażeń użytkownika w trybie nieaktywnym

Domyślnie podczas wdrażania trybu Zawsze na ekranie wygląd ekranu nie zmienia się, gdy zegarek przechodzi w tryb Ambient. Możesz zmodyfikować to zachowanie, zastępując metody w pliku AmbientLifecycleCallback.

Aby oszczędzać energię:

  • Oświetla mniej pikseli. Zastanów się, czy w trybie pełnoekranowym nie wystarczy wyświetlać tylko najważniejszych informacji, a więcej szczegółów podawać, gdy użytkownik wejdzie w tryb interaktywny.
  • Co najmniej 85% ekranu powinno być czarne. Usuń wypełnienie i użyj konturów w przypadku przycisków i dużych ikon.
  • Unikaj wyświetlania zbędnych informacji, takich jak niefunkcjonalne elementy marki i tła.
  • Elementy powinny być w tych trybach w tej samej pozycji i zawsze pokazywać godzinę.
  • Dostosuj treści, aby aktualizacje były rzadziej publikowane. Na przykład wyświetlanie zegara do najbliższej minuty zamiast do najbliższej sekundy.
  • Usuń lub pokaż interfejs zastępczy dla treści alfanumerycznych, które są często aktualizowane, takich jak odległość czy czas.
  • Usuń wskaźniki postępu, które są często aktualizowane, np. w przypadku odliczania, pierścieni i sesji multimedialnych.
  • Gdy użytkownik przejdzie w tryb ciągłego działania, a wcześniej znajdował się na ekranie konfiguracji lub ustawień w aplikacji, rozważ wyświetlenie bardziej odpowiedniego ekranu.
  • W obiekcie AmbientDetails przekazanym do metody onEnterAmbient():
    • Jeśli ustawiona jest wartość deviceHasLowBitAmbient, wyłącz w miarę możliwości wygładzanie krawędzi.
    • Jeśli wybrana jest opcja burnInProtectionRequired, przesuwaj wizualizację co jakiś czas i unikaj obszarów w pełni białych.
  • Unikaj ciągłej animacji w trybie nieaktywnym. Począwszy od Wear OS 5.1 animacje mogą przestać działać w trybie nieaktywnym.

Lista kontrolna wyświetlania bez przerw

Czasami może być konieczna maksymalna kontrola nad wyświetlaczem, gdy urządzenie przechodzi przez różne stany, np. gdy aplikacja do ćwiczeń chce uniknąć wyświetlania tarczy zegarka podczas treningu. W takich przypadkach wykonaj te czynności:

  1. Zaimplementuj interfejs AmbientLifecycleObserver.AmbientLifecycleCallback.
  2. Utwórz nowy układ oszczędzający energię, który będzie używany, gdy urządzenie będzie w trybie ambient.
  3. Podczas treningu wdróż trwającą aktywność.

Przykładem tego jest przykładowy ćwiczenia na GitHubie, który korzysta z komponentu AmbientAware z biblioteki Horologist.