Zawsze włączone aplikacje i tryb nieaktywny systemu

słowa kluczowe: wear,ambient,alwayson

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. Jeśli użytkownik ponownie wejdzie w interakcję z zegarkiem w określonym czasie, Wear OS przeniesie go z powrotem do aplikacji, w której skończył.

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 się wyświetlać w trybie nieaktywnym o niskim poborze mocy. 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 ma wpływ na czas pracy na baterii, dlatego weź to pod uwagę, dodając tę funkcję do swojej aplikacji.

Konfigurowanie projektu

Aby włączyć tryb obrazu w pracy, wykonaj te czynności:

  1. Utwórz lub zaktualizuj projekt na podstawie konfiguracji na stronie Tworzenie i uruchamianie aplikacji na urządzenie do noszenia.
  2. Dodaj uprawnienie WAKE_LOCK do pliku manifestu Androida:
<uses-permission android:name="android.permission.WAKE_LOCK" />

Włącz tryb Always On Display

Aby użyć klasy AmbientLifecycleObserver:

  1. Zaimplementuj interfejs AmbientLifecycleObserver.AmbientLifecycleCallback, jak w tym przykładzie. Na tym etapie metody są puste, ale w dalszej części 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ż potrzebne. Możesz na przykład wywołać tę metodę w metodzie onDestroy() swojej aktywności.

Aplikacje zawsze włączone mogą przechodzić na drugi plan

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

Modyfikowanie wyglądu 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ę, wykonaj te czynności:

  • Oświetla mniej pikseli i pozostawia większość ekranu w kolorze czarnym. Zastanów się, czy w trybie pełnoekranowym nie wystarczy wyświetlać tylko najważniejszych informacji, a więcej szczegółów podawać dopiero w trybie interaktywnym.
  • Dostosuj treści, aby aktualizacje były rzadziej publikowane. Na przykład wyświetlanie zegara do najbliższej minuty zamiast do najbliższej sekundy.
  • 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.

Podczas korzystania z Compose na Wear OS zalecamy używanie tych metod wywołania, aby aktualizować stan. Pozwala to systemowi odpowiednio przebudować interfejs użytkownika.

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