Z tego przewodnika dowiesz się, jak sprawić, aby aplikacja była zawsze włączona, jak reagować na zmiany stanu zasilania i jak zarządzać działaniem aplikacji, aby zapewnić użytkownikom komfort korzystania z niej przy jednoczesnym oszczędzaniu baterii.
Ciągłe wyświetlanie aplikacji ma znaczący wpływ na żywotność baterii, więc podczas dodawania tej funkcji należy wziąć pod uwagę zużycie energii.
Kluczowe pojęcia
Gdy aplikacja na Wear OS jest wyświetlana na pełnym ekranie, może być w jednym z 2 stanów zasilania:
- Interaktywny: stan wysokiego poboru mocy, w którym ekran ma pełną jasność i umożliwia pełną interakcję z użytkownikiem.
- Otoczenie: stan niskiego zużycia energii, w którym wyświetlacz przyciemnia się, aby oszczędzać energię. W tym stanie interfejs aplikacji nadal zajmuje cały ekran, ale system może zmienić jego wygląd, np. rozmyć go lub nałożyć na niego treści, takie jak godzina. Jest to tzw. oświetlenie kinowe.
System operacyjny kontroluje przejście między tymi stanami.
Aplikacja zawsze włączona to aplikacja, która wyświetla treści w trybach interaktywnym i otoczenia.
Gdy zawsze aktywna aplikacja nadal wyświetla swój interfejs, gdy urządzenie jest w stanie niskiego zużycia energii Ambient, jest to określane jako tryb ambiactive.
Przejścia systemowe i domyślne zachowanie
Gdy aplikacja działa na pierwszym planie, system zarządza przejściami między stanami zasilania na podstawie 2 limitów czasu wywoływanych przez nieaktywność użytkownika.
- Limit czasu 1: stan interaktywny do stanu otoczenia: po okresie nieaktywności użytkownika urządzenie przechodzi w stan otoczenia.
- Limit czasu 2: powrót do tarczy zegarka: po kolejnym okresie braku aktywności system może ukryć bieżącą aplikację i wyświetlić tarczę zegarka.
Bezpośrednio po przejściu systemu w stan Ambient domyślne działanie zależy od wersji Wear OS i konfiguracji aplikacji:
- Na Wear OS 5 i starszych wersjach system wyświetla rozmyty zrzut ekranu wstrzymanej aplikacji z nałożonym na niego czasem.
- W przypadku Wear OS 6 i nowszych wersji, jeśli aplikacja jest kierowana na pakiet SDK 36 lub nowszy, jest uznawana za zawsze włączoną. Wyświetlacz jest przyciemniony, ale aplikacja nadal działa i jest widoczna. (Aktualizacje mogą być wykonywane nawet raz na minutę).
Dostosowywanie działania w trybie nieaktywnym
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 AmbientLifecycleObserver
do nasłuchiwania wywołań zwrotnych podczas przejść między stanami.
Używanie klasy AmbientLifecycleObserver
Aby reagować na zdarzenia w trybie otoczenia, użyj klasy AmbientLifecycleObserver
:
Zaimplementuj interfejs
AmbientLifecycleObserver.AmbientLifecycleCallback
. Użyj metodyonEnterAmbient()
, aby dostosować interfejs do stanu niskiego zużycia energii, a metodyonExitAmbient()
, aby przywrócić pełną interaktywność wyświetlacza.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 funkcji kompozycyjnej.private val ambientObserver = AmbientLifecycleObserver(activity, ambientCallback) override fun onCreate(savedInstanceState: Bundle) { super.onCreate(savedInstanceState) lifecycle.addObserver(ambientObserver) // ... }
Zadzwoń pod numer
removeObserver()
, aby usunąć obserwatora wonDestroy()
.
Deweloperom korzystającym z Jetpack Compose biblioteka Horologist udostępnia przydatne narzędzie, czyli komponent AmbientAware
, który upraszcza implementację tego wzorca.
Tekst czasu z uwzględnieniem otoczenia
W przypadku Wear OS 6 w ramach wyjątku od wymagania niestandardowego obserwatora widżet TimeText
jest dostosowany do trybu otoczenia. Automatycznie aktualizuje się raz na minutę, gdy urządzenie jest w stanie Ambient, bez konieczności dodawania dodatkowego kodu.
Sterowanie czasem włączenia ekranu
W sekcjach poniżej znajdziesz informacje o tym, jak zarządzać czasem wyświetlania aplikacji na ekranie.
Zapobieganie powrotowi do tarczy zegarka w przypadku trwającej aktywności
Po pewnym czasie w stanie Ambient (Timeout 2) system zwykle wraca do tarczy zegarka. Użytkownik może skonfigurować czas trwania limitu czasu w ustawieniach systemu. W niektórych przypadkach, np. gdy użytkownik śledzi trening, aplikacja może być widoczna dłużej.
W przypadku Wear OS 5 i nowszych możesz temu zapobiec, wdrażając OngoingActivity. Jeśli aplikacja wyświetla informacje o trwającym zadaniu użytkownika, np. o sesji treningowej, możesz użyć interfejsu Ongoing Activity API, 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 trwałego powiadomienia musi wskazywać zawsze aktywne działanie, 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() }
Pozostawianie włączonego ekranu i zapobieganie przejściu w stan nieaktywny
W rzadkich przypadkach może być konieczne całkowite uniemożliwienie przejścia urządzenia w stan nieaktywny. Chodzi o uniknięcie przekroczenia limitu czasu nr 1. Możesz do tego użyć flagi okna FLAG_KEEP_SCREEN_ON
. Działa to jak blokada wybudzania, która utrzymuje urządzenie w stanie interaktywnym. Używaj tej funkcji z dużą ostrożnością, ponieważ ma ona duży wpływ na żywotność baterii.
Rekomendacje 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. Te rekomendacje stawiają na pierwszym miejscu wygodę użytkowników, zapobiegając wprowadzaniu w błąd i ograniczając nadmiar elementów wizualnych, a jednocześnie optymalizując moc wyświetlania.
- Zmniejsz wizualny bałagan i zwiększ moc wyświetlania. Czysty, minimalistyczny interfejs informuje użytkownika, że aplikacja jest w stanie niskiego zużycia energii, i znacznie oszczędza baterię, ograniczając jasne piksele.
- Co najmniej 85% ekranu musi być czarne.
- Wyświetlaj tylko najważniejsze informacje, a szczegóły dodatkowe przenieś na wyświetlacz interaktywny.
- W przypadku dużych ikon lub przycisków używaj obramowań zamiast pełnych wypełnień.
- Unikaj dużych bloków jednolitego koloru oraz niefunkcjonalnych obrazów z logo lub tłem.
- Obsługa nieaktualnych danych dynamicznych
- Wywołanie zwrotne
onUpdateAmbient()
jest wywoływane tylko okresowo – zwykle raz na minutę – aby oszczędzać energię. Z tego powodu wszelkie dane, które często się zmieniają, np. stoper, tętno czy dystans treningu, stają się nieaktualne między aktualizacjami. Aby uniknąć wyświetlania wprowadzających w błąd i nieprawidłowych informacji, nasłuchuj wywołania zwrotnegoonEnterAmbient
i zastąp te aktywne wartości statyczną treścią zastępczą, np.--
.
- Wywołanie zwrotne
- Zachowaj spójny układ
- Zachowaj elementy w tej samej pozycji w trybach interaktywnym i otoczenia, aby zapewnić płynne przejście.
- Zawsze pokazuj czas.
- Uwzględniaj kontekst
- Jeśli w momencie przejścia urządzenia w tryb otoczenia użytkownik był na ekranie ustawień lub konfiguracji, rozważ wyświetlenie bardziej odpowiedniego ekranu z Twojej aplikacji zamiast widoku ustawień.
- Obsługa wymagań dotyczących konkretnych urządzeń
- W obiekcie
AmbientDetails
przekazanym do metodyonEnterAmbient()
:- Jeśli
deviceHasLowBitAmbient
totrue
, wyłącz wygładzanie, jeśli to możliwe. - Jeśli
burnInProtectionRequired
jesttrue
, okresowo przesuwaj nieznacznie elementy interfejsu i unikaj jednolitych białych obszarów, aby zapobiec wypaleniu ekranu.
- Jeśli
- W obiekcie
Debugowanie i testowanie
Te polecenia adb
mogą być przydatne podczas programowania lub testowania działania aplikacji, gdy urządzenie jest w trybie otoczenia:
# 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 treningowej. Aplikacja musi być widoczna podczas przejść do stanu Ambient i nie może być zastępowana przez tarczę zegarka.
Aby to zrobić, deweloper powinien wykonać te czynności:
- Zaimplementuj
AmbientLifecycleObserver
, aby obsługiwać zmiany interfejsu między stanami interaktywnym i otoczenia, takie jak 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.
- Używaj interfejsu Ongoing Activity API przez cały czas trwania treningu, aby zapobiec powrotowi systemu do tarczy zegarka.
Pełną implementację znajdziesz w przykładowej aplikacji do ćwiczeń opartej na Compose w GitHubie. Ten przykład pokazuje też, jak używać funkcji AmbientAware
z biblioteki Horologist, aby uprościć obsługę trybu otoczenia w Compose.