Na tej stronie omawiamy niektóre typowe przyczyny, dla których usługi działające na pierwszym planie mogą się nie uruchamiać, i pomagamy zidentyfikować przyczynę problemu.
W tym dokumencie omawiamy te problemy:
Zanim przystąpisz do rozwiązywania problemów
Sprawdź, czy ostatnio wprowadzono zmiany w usługach działających na pierwszym planie
Nieprawidłowe używanie usług działających na pierwszym planie może mieć negatywny wpływ na wydajność urządzenia i żywotność baterii. Z tego powodu w kolejnych wersjach platformy Android często wprowadzamy zmiany w działaniu usług działających na pierwszym planie, aby ograniczyć te negatywne skutki.
Jeśli masz problemy z usługami działającymi na pierwszym planie, sprawdź dokumentację dotyczącą zmian w tych usługach i zobacz, czy nie ma w niej żadnych ostatnich zmian, które mogłyby wyjaśnić Twoje problemy. Szczególnie ważne jest sprawdzenie zmian w tych okolicznościach:
- Kod usługi działającej na pierwszym planie, który wcześniej działał, teraz się nie uruchamia.
- Właśnie zaczęto testować nową wersję platformy lub zmieniono poziom interfejsu API, na który jest kierowana aplikacja.
Błędy typu Aplikacja nie odpowiada (ANR)
W pewnych okolicznościach aplikacja powinna wyłączyć usługę działającą na pierwszym planie. Jeśli aplikacja nie zatrzyma usługi, system ją zatrzyma i wywoła błąd Aplikacja nie odpowiada (ANR).
Krótka usługa działa zbyt długo, co powoduje błąd ANR
Usługi działające na pierwszym planie, które używają typu krótkiej usługi
muszą zostać ukończone szybko, w ciągu około 3 minut. Gdy czas się skończy, system wywoła metodę usługi.Service.onTimeout(int,int) Usługa ma
kilka sekund na wywołanie stopSelf(). Jeśli usługa nie zatrzyma się sama, system wywoła błąd Aplikacja nie odpowiada.
Diagnoza:
Jeśli błąd ANR został spowodowany tym, że usługa działająca na pierwszym planie nie zatrzymała się sama, system zgłosi wyjątek wewnętrzny. Możesz sprawdzić, czy tak było, przeglądając raporty ANR. Jeśli to jest przyczyną problemu, raport będzie zawierać ten komunikat:
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type FOREGROUND_SERVICE_TYPE_SHORT_SERVICE did not stop within its timeout:
[component name]"
Rozwiązanie:
Upewnij się, że wszystkie usługi działające na pierwszym planie z limitem czasu kończą pracę i wywołują
stopForeground(int) w ramach limitu czasu systemu.
Sprawdź, czy usługi działające na pierwszym planie implementują Service.onTimeout(int,int).
Upewnij się, że implementacja tej metody od razu wywołuje stopSelf().
Wyjątki usług działających na pierwszym planie
W tej sekcji opisujemy kilka problemów z usługami działającymi na pierwszym planie, które mogą spowodować zgłoszenie wyjątku przez system. Jeśli aplikacja nie przechwyci wyjątku, użytkownik zobaczy okno z informacją, że aplikacja została zatrzymana.
W niektórych przypadkach system zgłasza wyjątek wewnętrzny. W takich przypadkach możesz sprawdzić, jaki to był wyjątek, przeglądając zrzut stosu, a w Logcat możesz znaleźć bardziej szczegółowe informacje o błędzie.
Wyjątek wewnętrzny: przekroczono limit czasu
System nakłada limit czasu działania usług działających na pierwszym planie związanych z synchronizacją danych i przetwarzaniem multimediów, gdy aplikacja działa w tle. Jeśli usługa przekroczy ten limit, system wywoła metodę Service.onTimeout(int,int) usługi. Usługa ma kilka sekund na wywołanie stopSelf(). Jeśli usługa nie zatrzyma się sama, system wygeneruje wewnętrzny wyjątek RemoteServiceException, który spowoduje awarię aplikacji.
Diagnoza:
Możesz sprawdzić, jaki to był wyjątek, przeglądając ślad stosu, a w Logcat możesz znaleźć bardziej szczegółowe informacje o błędzie. W tym przypadku Logcat zawiera ten komunikat o błędzie:
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type [service type] did not stop within its timeout: [component name]"
Rozwiązanie:
Upewnij się, że wszystkie usługi działające na pierwszym planie z limitem czasu kończą pracę i wywołują stopForeground(int) w ramach limitu czasu systemu.
Sprawdź, czy usługi działające na pierwszym planie implementują Service.onTimeout(int,int).
Upewnij się, że implementacja tej metody od razu wywołuje stopSelf().
Wyjątek wewnętrzny: ForegroundServiceDidNotStartInTimeException
Gdy uruchamiasz usługę, wywołując
context.startForegroundService(),
ma ona kilka sekund na to, aby promować się na usługę działającą na pierwszym planie, wywołując
ServiceCompat.startForeground().
Jeśli usługa tego nie zrobi, system zgłosi wewnętrzny wyjątek ForegroundServiceDidNotStartInTimeException.
Diagnoza:
Możesz sprawdzić, jaki to był wyjątek, przeglądając ślad stosu, a w Logcat możesz znaleźć bardziej szczegółowe informacje o błędzie. W tym przypadku Logcat zawiera ten komunikat o błędzie:
android.app.RemoteServiceException$ForegroundServiceDidNotStartInTimeException:
Context.startForegroundService() did not then call Service.startForeground()
Rozwiązanie:
Upewnij się, że wszystkie nowo utworzone usługi działające na pierwszym planie wywołują ServiceCompat.startForeground() w ciągu kilku sekund.
WorkManager:
Ten wyjątek może też występować w przypadku procesów roboczych WorkManager, które wykonują usługę działającą na pierwszym planie
(wywołują setForegound lub setForegroundAsync). Gdy cykl życia 2 procesów roboczych działających na pierwszym planie nakłada się na siebie, ponieważ jeden proces roboczy próbuje uruchomić usługę działającą na pierwszym planie
, a wcześniej działająca usługa działająca na pierwszym planie próbuje się zamknąć, awarii będzie towarzyszyć ten log:
Re-initializing SystemForegroundService after a request to shut-down
Poprawka usuwająca tę awarię została wprowadzona w WorkManager w wersji 2.10.5.
Jeśli w Twojej aplikacji występuje ten wyjątek, zaktualizuj ją do najnowszej wersji WorkManager i zgłoś wszelkie utrzymujące się problemy w narzędziu do śledzenia problemów WorkManager issue tracker.
ForegroundServiceStartNotAllowedException
Błąd:
System zgłasza ForegroundServiceStartNotAllowedException.
Przyczyna:
Zwykle jest to spowodowane tym, że aplikacja uruchamia usługę działającą na pierwszym planie w tle, gdy nie ma ważnego zwolnienia.
Od Androida 12 (API na poziomie 31) aplikacje nie mogą uruchamiać
usług działających na pierwszym planie, gdy działają w
tle, z
kilkoma wyjątkami.
Jeśli spróbujesz uruchomić usługę działającą na pierwszym planie w tle i nie spełniasz wymagań jednego ze zwolnień, system zgłosi wyjątek ForegroundServiceStartNotAllowedException. System zrobi to również, jeśli nie spełniasz wymagań zwolnienia.
Na przykład aplikacja może mieć przycisk, który użytkownik może kliknąć, co spowoduje, że aplikacja wykona pewne przetwarzanie, a następnie uruchomi usługę działającą na pierwszym planie. W takim przypadku istnieje ryzyko, że użytkownik kliknie przycisk, a następnie natychmiast przełączy aplikację w tle. Aplikacja spróbuje wtedy uruchomić usługę w tle. Jeśli aplikacja nie spełnia jednego z określonych zwolnień, system zgłosi wyjątek ForegroundServiceStartNotAllowedException.
Ponadto niektóre zwolnienia mają krótki limit czasu. Na przykład istnieje krótkie zwolnienie, jeśli aplikacja uruchamia usługę działającą na pierwszym planie w odpowiedzi na wiadomość FCM o wysokim priorytecie. Jeśli nie uruchomisz usługi wystarczająco szybko, otrzymasz wyjątek ForegroundServiceStartNotAllowedException.
Wraz z nowymi wersjami Androida niektóre zwolnienia stają się bardziej restrykcyjne. Jeśli zmienisz wersję Androida, na którą jest kierowana aplikacja, sprawdź dokumentację dotyczącą zmian w usługach działających na pierwszym planie i upewnij się, że aplikacja nadal spełnia jedno z dozwolonych zwolnień.
Rozwiązanie:
Zmień przepływ pracy aplikacji, aby nie musiała uruchamiać usług działających na pierwszym planie, gdy działa w tle, lub upewnij się, że aplikacja spełnia jedno ze zwolnień.
Do zarządzania cyklem życia aplikacji możesz używać komponentów uwzględniających cykl życia, aby nie próbować nieumyślnie uruchamiać usługi działającej na pierwszym planie w tle.
SecurityException
Błąd:
System zgłasza wyjątekSecurityException.
Przyczyna:
Aplikacja próbowała uruchomić usługę działającą na pierwszym planie bez wymaganych uprawnień.
- Jeśli aplikacja jest kierowana na Androida 9 (API na poziomie 28) lub nowszego, musi mieć uprawnienie
FOREGROUND_SERVICE, aby uruchomić usługę działającą na pierwszym planie. - Jeśli aplikacja jest kierowana na Androida 14 (API na poziomie 34) lub nowszego, musi spełniać wszystkie wymagania wstępne dotyczące typu usługi działającej na pierwszym planie. Te wymagania wstępne są
szczegółowo opisane w dokumentacji typów usług działających na pierwszym planie. Pamiętaj w szczególności o tych wymaganiach:
- Kilka typów usług działających na pierwszym planie wymaga określonych uprawnień w czasie działania. Na przykład usługa działająca na pierwszym planie związana z przesyłaniem wiadomości zdalnych musi mieć uprawnienie
FOREGROUND_SERVICE_REMOTE_MESSAGING.
- Kilka typów usług działających na pierwszym planie wymaga określonych uprawnień w czasie działania. Na przykład usługa działająca na pierwszym planie związana z przesyłaniem wiadomości zdalnych musi mieć uprawnienie
- W kilku przypadkach obowiązują dodatkowe ograniczenia dotyczące uprawnień wymaganych przez niektóre typy usług działających na pierwszym planie, gdy aplikacja jest używana. Te uprawnienia są
przyznawane aplikacji tylko wtedy, gdy działa ona na pierwszym planie (z kilkoma
wyjątkami). Oznacza to, że nawet jeśli aplikacja poprosiła o jedno z tych uprawnień i je otrzymała, a spróbuje uruchomić usługę działającą na pierwszym planie, gdy działa w tle, system zgłosi wyjątek
SecurityException, nawet jeśli aplikacja ma zwolnienie z obowiązku uruchamiania usługi działającej na pierwszym planie w tle. Więcej informacji znajdziesz w artykule Ograniczenia dotyczące uruchamiania usług działających na pierwszym planie, które wymagają uprawnień podczas używania uprawnień.- Możesz otrzymać wyjątek
SecurityException, jeśli poprosisz o niezbędne uprawnienia, ale uruchomisz usługę działającą na pierwszym planie, zanim potwierdzisz, że wymagane uprawnienia zostały przyznane.
- Możesz otrzymać wyjątek
Rozwiązanie:
Zanim uruchomisz usługę działającą na pierwszym planie, poproś o wszystkie odpowiednie uprawnienia i upewnij się, że spełniasz wszystkie inne wymagania wstępne dotyczące czasu działania.