Z tego przewodnika dowiesz się, jak sprawić, aby aplikacja była zawsze włączona, jak reagować na zmiany stanu zasilania oraz jak zarządzać działaniem aplikacji, aby zapewnić użytkownikom dobre wrażenia i oszczędzać baterię.
Utrzymywanie aplikacji w ciągłej widoczności ma znaczący wpływ na czas pracy na baterii, dlatego przed dodaniem tej funkcji zastanów się nad wpływem na zużycie energii.
Kluczowe pojęcia
Gdy aplikacja Wear OS jest wyświetlana na pełnym ekranie, może znajdować się w jednym z tych stanów:
- Interaktywna: tryb o wysokiej mocy, w którym ekran ma pełną jasność, co umożliwia pełną interakcję z użytkownikiem.
- Ambient: tryb niskiego zużycia energii, w którym wyświetlacz jest przyciemniony, aby oszczędzać energię. W tym stanie interfejs aplikacji nadal zajmuje cały ekran, ale system może zmienić jego wygląd, na przykład przez rozmycie lub nałożenie treści, takich jak godzina. Jest to również nazywane oświetleniem kinowym.
System operacyjny kontroluje przejścia między tymi stanami.
Aplikacja zawsze włączona to aplikacja, która wyświetla treści zarówno w stanie interaktywnym, jak i trybułowym.
Gdy aplikacja zawsze aktywna wyświetla swój interfejs, gdy urządzenie jest w stanie tła o niskim poborze mocy, mówi się, że jest w trybie ambiaktywnym.
Przejścia między systemami i domyślne zachowanie
Gdy aplikacja jest na pierwszym planie, system zarządza przejściami między stanami zasilania na podstawie 2 limitów czasu aktywowanych przez nieaktywność użytkownika.
- Limit czasu 1: przejście ze stanu interaktywnego do stanu biernego: po okresie braku aktywności użytkownika urządzenie przechodzi w stan bierny.
- Limit czasu 2: powrót do tarczy zegarka: po dłuższym okresie bezczynności system może ukryć bieżącą aplikację i wyświetlić tarczę zegarka.
Bezpośrednio po tym, jak system przejdzie przez pierwszy stan przejścia do stanu tła, domyślne działanie zależy od wersji Wear OS i konfiguracji aplikacji:
- W Wear OS 5 i starszych wersjach system wyświetla niewyraźny zrzut ekranu z zatrzymanej aplikacji z czasem nałożonym u góry.
- Na Wear OS 6 i nowszych, jeśli aplikacja jest kierowana na pakiet SDK 36 lub nowszy, jest uważana za aplikację zawsze włączoną. Ekran jest przyciemniony, ale aplikacja nadal działa i jest widoczna. (aktualizacje mogą być wykonywane nawet raz na minutę).
Dostosowywanie działania trybu nieaktywnego
Niezależnie od domyślnego działania systemu, we wszystkich wersjach Wear OS możesz dostosować wygląd lub działanie aplikacji w stanie Ambient, używając do tego AmbientLifecycleObserver
, aby odbierać wywołania zwrotne podczas przechodzenia między stanami.
Używanie klasy AmbientLifecycleObserver
Aby reagować na zdarzenia związane z oświetleniem kinowym, użyj klasy AmbientLifecycleObserver
:
Zaimplementuj interfejs
AmbientLifecycleObserver.AmbientLifecycleCallback
. Aby dostosować interfejs do trybu niskiego poboru mocy, użyj metodyonEnterAmbient()
, a aby przywrócić pełny interaktywny wyświetlacz, użyj metodyonExitAmbient()
.val ambientCallback = object : AmbientLifecycleObserver.AmbientLifecycleCallback { override fun onEnterAmbient(ambientDetails: AmbientLifecycleObserver.AmbientDetails) { // ... Called when moving from interactive mode into ambient mode. // Adjust UI for low-power state: dim colors, hide non-essential elements. } override fun onExitAmbient() { // ... Called when leaving ambient mode, back into interactive mode. // Restore full UI. } override fun onUpdateAmbient() { // ... Called by the system periodically (typically once per minute) // to allow the app to update its display while in ambient mode. } }
Utwórz
AmbientLifecycleObserver
i zarejestruj go w cyklu życia aktywności lub komponentu.private val ambientObserver = AmbientLifecycleObserver(activity, ambientCallback) override fun onCreate(savedInstanceState: Bundle) { super.onCreate(savedInstanceState) lifecycle.addObserver(ambientObserver) // ... }
Aby usunąć obserwatora w
onDestroy()
, zadzwoń pod numerremoveObserver()
.
Deweloperzy korzystający z Jetpack Compose mogą skorzystać z biblioteki Horologist, która zawiera przydatną funkcję AmbientAware
, która upraszcza implementację tego wzorca.
TimeText uwzględniający otoczenie
Wyjątkiem od wymaganego niestandardowego obserwatora jest to, że w Wear OS 6 widżet TimeText
jest świadomy otoczenia. Automatycznie aktualizuje się raz na minutę, gdy urządzenie jest w stanie Ambient, bez konieczności stosowania dodatkowego kodu.
Sterowanie czasem wyświetlania
W następnych sekcjach dowiesz się, jak zarządzać czasem wyświetlania aplikacji na ekranie.
Zapobieganie powrotowi do tarczy zegarka podczas trwającej aktywności
Po upływie określonego czasu w stanie Ambient (czas oczekiwania 2), system zazwyczaj wraca do tarczy zegarka. Użytkownik może skonfigurować czas oczekiwania w ustawieniach systemu. W niektórych przypadkach, np. gdy użytkownik śledzi trening, aplikacja może być widoczna dłużej.
W systemie Wear OS 5 lub nowszym możesz temu zapobiec, wdrażając działanie ciągłe. Jeśli aplikacja wyświetla informacje o bieżącym zadaniu użytkownika, na przykład sesji treningowej, możesz użyć interfejsu API dotyczącego bieżącej aktywności, aby aplikacja była widoczna do czasu zakończenia zadania. Jeśli użytkownik ręcznie wróci do tarczy zegarka, wskaźnik trwającej aktywności umożliwi mu powrót do aplikacji jednym kliknięciem.
Aby to zaimplementować, intencja dotknięcia w powiadomieniu ciągłym musi wskazywać na Twoją zawsze aktywną czynność, jak pokazano w tym fragmencie kodu:
private fun createNotification(): Notification { val activityIntent = Intent(this, AlwaysOnActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_SINGLE_TOP } val pendingIntent = PendingIntent.getActivity( this, 0, activityIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) val notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID) // ... // ... .setOngoing(true) // ... val ongoingActivity = OngoingActivity.Builder(applicationContext, NOTIFICATION_ID, notificationBuilder) // ... // ... .setTouchIntent(pendingIntent) .build() ongoingActivity.apply(applicationContext) return notificationBuilder.build() }
Pozostawienie włączonego ekranu i zapobieganie przejściu w stan nieaktywny
W rzadkich przypadkach może być konieczne całkowite uniemożliwienie urządzeniu przejścia w stan Nieaktywny. Oznacza to, że należy unikać problemu 1. Możesz to zrobić, używając flagi okna FLAG_KEEP_SCREEN_ON
. Działa ona jak blokada aktywacji, utrzymując urządzenie w stanie Interaktywny. Używaj tej funkcji z największą ostrożnością, ponieważ ma ona duży wpływ na żywotność baterii.
Zalecenia dotyczące trybu nieaktywnego
Aby zapewnić użytkownikom jak najlepsze wrażenia i oszczędzać energię w trybie Ambient, postępuj zgodnie z tymi wytycznymi dotyczącymi projektowania.
- Używanie minimalistycznego wyświetlacza o niskim poborze mocy
- Co najmniej 85% ekranu musi być czarne.
- W przypadku dużych ikon lub przycisków zamiast wypełnień używaj konturów.
- Wyświetlaj tylko najważniejsze informacje, przenosząc szczegóły drugorzędne do wyświetlacza interaktywnego.
- Unikaj dużych bloków jednolitej barwy oraz niefunkcjonalnych elementów marki lub obrazów tła.
- Zadbaj o odpowiednie aktualizacje treści
- W przypadku często zmieniających się danych, takich jak stoper, odległość treningu lub czas, wyświetlaj treści zastępcze, np.
--
, aby uniknąć wrażenia, że treści są aktualne. - Usuń wskaźniki postępu, które są stale aktualizowane, np. pierście odliczania czy sesje multimedialne.
- Wywołania zwrotnego
onUpdateAmbient()
należy używać tylko do wprowadzania istotnych aktualizacji, zwykle raz na minutę.
- W przypadku często zmieniających się danych, takich jak stoper, odległość treningu lub czas, wyświetlaj treści zastępcze, np.
- Utrzymuj spójny układ
- Aby uzyskać płynne przejście, zachowaj elementy w tych samych pozycjach w trybach Interaktywny i Tło.
- Zawsze pokazuj godzinę.
- Uwzględniaj kontekst
- Jeśli użytkownik był na ekranie ustawień lub konfiguracji, gdy urządzenie weszło w tryb Ambient, rozważ wyświetlenie bardziej odpowiedniego ekranu aplikacji zamiast widoku ustawień.
- Zarządzanie wymaganiami dotyczącymi poszczególnych urządzeń
- W obiekcie
AmbientDetails
przekazanym do metodyonEnterAmbient()
:- Jeśli
deviceHasLowBitAmbient
totrue
, wyłącz w miarę możliwości wygładzanie krawędzi. - Jeśli
burnInProtectionRequired
totrue
, okresowo przesuwaj elementy interfejsu, unikając przy tym czysto białych obszarów, aby zapobiec wypaleniu ekranu.
- Jeśli
- W obiekcie
Debugowanie i testowanie
Te polecenia adb
mogą być przydatne podczas tworzenia i testowania aplikacji w trybie ambient:
# put device in ambient mode if the always on display is enabled in settings
# (and not disabled by other settings, such as theatre mode)
$ adb shell input keyevent KEYCODE_SLEEP
# put device in interactive mode
$ adb shell input keyevent KEYCODE_WAKEUP
Przykład: aplikacja do ćwiczeń
Weźmy pod uwagę aplikację do ćwiczeń, która musi wyświetlać użytkownikowi dane przez cały czas trwania sesji. Aplikacja musi pozostać widoczna podczas przechodów w stanie Ambient i nie może być zastępowana przez tarczę zegarka.
Aby to osiągnąć, deweloper powinien wykonać te czynności:
- Wprowadź
AmbientLifecycleObserver
, aby obsługiwać zmiany interfejsu użytkownika między stanami interaktywnym i tła, np. przyciemnianie ekranu i usuwanie nieistotnych danych. - Utwórz nowy układ o niskim poborze mocy dla stanu ambient, który jest zgodny ze sprawdzonymi metodami.
- Podczas treningu używaj interfejsu API trwającej aktywności, aby system nie przełączał się na tarczę zegarka.
Pełną implementację znajdziesz w przykładowym ćwiczeniu na GitHub, które wykorzystuje kompozycję. Przykład pokazuje też użycie komponentu AmbientAware
z biblioteki Horologist w celu uproszczenia obsługi trybu otoczenia w Compose.