Aplikacje kierowane na Androida 12 (poziom interfejsu API 31) lub nowszego nie mogą uruchamiać usług na pierwszym planie, gdy aplikacja działa w tle, z wyjątkiem kilku szczególnych przypadków. Jeśli aplikacja próbuje uruchomić usługę na pierwszym planie, gdy sama działa w tle, a usługa na pierwszym planie nie spełnia jednego z wyjątkowych przypadków, system zgłasza błąd ForegroundServiceStartNotAllowedException
.
Jeśli aplikacja chce uruchomić usługę na pierwszym planie, która wymaga uprawnień w trakcie korzystania (np. uprawnień do korzystania z czujnika ciała, aparatu, mikrofonu lub lokalizacji), nie może tworzyć tej usługi, gdy działa w tle, nawet jeśli kwalifikuje się do jednej z wyjątków od ograniczeń uruchamiania w tle. Wyjaśnienie tego powodu znajdziesz w sekcji Ograniczenia uruchamiania usług na pierwszym planie, które wymagają uprawnień podczas korzystania.
Wyjątki od ograniczeń dotyczących uruchamiania w tle
W tych sytuacjach aplikacja może uruchamiać usługi na pierwszym planie, nawet gdy sama działa w tle:
- aplikacja przechodzi ze stanu widocznego dla użytkownika, np. aktywności;
- Aplikacja może rozpocząć działanie w tle, z wyjątkiem sytuacji, gdy ma ona aktywność w stosie poprzednich zadań.
Twoja aplikacja otrzymuje wiadomość o wysokim priorytecie za pomocą Komunikacji w chmurze Firebase.
Użytkownik wykonuje działanie związane z elementem UI w Twojej aplikacji. Może na przykład wejść w interakcję z bąbelkiem, powiadomieniem, widżetem lub aktywnością.
Aplikacja wywołuje alarm precyzyjny, aby wykonać działanie, o które prosi użytkownik.
Aplikacja jest bieżącą metodą wprowadzania danych na urządzeniu.
Twoja aplikacja otrzymuje zdarzenie związane z geofencingiem lub przejściem do trybu rozpoznawania aktywności.
Gdy urządzenie się uruchomi ponownie i odbierze działanie
ACTION_BOOT_COMPLETED
,ACTION_LOCKED_BOOT_COMPLETED
lubACTION_MY_PACKAGE_REPLACED
, działanie w ramach intent broadcast receiver.Twoja aplikacja otrzymuje działanie intencyjne
ACTION_TIMEZONE_CHANGED
,ACTION_TIME_CHANGED
lubACTION_LOCALE_CHANGED
w odbiorniku.Twoja aplikacja odbiera zdarzenie
ACTION_TRANSACTION_DETECTED
zNfcService
.Aplikacje z określonymi rolami systemowymi lub uprawnieniami, takie jak właściciele urządzenia i właściciele profilu.
Aplikacja korzysta z Menedżera urządzeń towarzyszących i deklaruje uprawnienie
REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND
lub uprawnienieREQUEST_COMPANION_RUN_IN_BACKGROUND
. W miarę możliwości używaj taguREQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND
.Użytkownik wyłącza optymalizację baterii w Twojej aplikacji.
Twoja aplikacja ma uprawnienie
SYSTEM_ALERT_WINDOW
. Uwaga: jeśli Twoja aplikacja jest kierowana na Androida 15 lub nowszego, musi mieć uprawnienieSYSTEM_ALERT_WINDOW
i musi mieć obecnie widoczne okno nakładki.
Ograniczenia dotyczące uruchamiania usług na pierwszym planie, które wymagają uprawnień podczas korzystania
W Androidzie 14 (poziom API 34) lub nowszym występują specjalne sytuacje, o których musisz pamiętać, gdy uruchamiasz usługę na pierwszym planie, która wymaga uprawnień podczas korzystania.
Jeśli Twoja aplikacja jest kierowana na Androida 14 lub nowszą wersję, podczas tworzenia usługi na pierwszym planie system operacyjny sprawdza, czy aplikacja ma wszystkie odpowiednie uprawnienia dla tego typu usługi. Na przykład, gdy utworzysz usługę na pierwszym planie typu mikrofon, system operacyjny sprawdzi, czy Twoja aplikacja ma obecnie uprawnienie RECORD_AUDIO
. Jeśli nie masz tego uprawnienia, system wyświetli błąd SecurityException
.
W przypadku uprawnień do korzystania z usług może to spowodować problem. Jeśli aplikacja ma uprawnienia „podczas używania”, ma je tylko podczas działania na pierwszym planie. Oznacza to, że jeśli aplikacja działa w tle i próbuje utworzyć usługę na pierwszym planie typu kamera, lokalizacja lub mikrofon, system stwierdza, że aplikacja obecnie nie ma wymaganych uprawnień, i wyrzuca błądSecurityException
.
Podobnie, jeśli aplikacja działa w tle i tworzy usługę medyczną, która wymaga uprawnienia BODY_SENSORS
, a aplikacja nie ma tego uprawnienia, system zgłasza wyjątek.
(Nie dotyczy to usług medycznych, które wymagają innych uprawnień, takich jak ACTIVITY_RECOGNITION
). Nawet wywołanie funkcji PermissionChecker.checkSelfPermission()
nie nie zapobiegnie temu problemowi. Jeśli aplikacja ma uprawnienia podczas korzystania i wywołuje metodę checkSelfPermission()
, aby sprawdzić, czy ma te uprawnienia, metoda zwraca PERMISSION_GRANTED
, nawet jeśli aplikacja jest w tle. Jeśli metoda zwraca wartość PERMISSION_GRANTED
, oznacza to, że „Twoja aplikacja ma to uprawnienie podczas używania aplikacji”.
Jeśli więc usługa na pierwszym planie potrzebuje uprawnienia „podczas używania”, musisz wywołać funkcję Context.startForegroundService()
lub Context.bindService()
, gdy aplikacja ma widoczną aktywność, chyba że usługa kwalifikuje się do jednej z określonych wyjątków.
Wyjątki od ograniczeń dotyczących uprawnień podczas korzystania
W niektórych sytuacjach nawet wtedy, gdy usługa na pierwszym planie jest uruchomiona, gdy aplikacja działa w tle, może ona nadal uzyskiwać informacje o lokalizacji, kamerze i mikrofonie, gdy aplikacja działa na pierwszym planie („podczas używania”).
W tych samych sytuacjach, jeśli usługa deklaruje typ usługi na pierwszym planie location
i jest uruchamiana przez aplikację, która ma uprawnienia ACCESS_BACKGROUND_LOCATION
, usługa ta może mieć dostęp do informacji o lokalizacji przez cały czas, nawet gdy aplikacja działa w tle.
Poniżej znajdziesz listę takich sytuacji:
- Usługę uruchamia komponent systemu.
- Usługa zaczyna się od interakcji z widżetami aplikacji.
- Usługa rozpoczyna się od interakcji z powiadomieniem.
- Usługa rozpoczyna się jako
PendingIntent
wysyłana z innej widocznej aplikacji. - Usługa uruchamia aplikację, która jest kontrolerem zasad urządzeń i działa w trybie właściciela urządzenia.
- Usługa jest uruchamiana przez aplikację, która zapewnia
VoiceInteractionService
. - Usługa jest uruchamiana przez aplikację, która ma uprawnienia
START_ACTIVITIES_FROM_BACKGROUND
.
Określanie usług, których dotyczy problem w aplikacji
Podczas testowania aplikacji uruchom jej usługi działające na pierwszym planie. Jeśli uruchomiona usługa ma ograniczony dostęp do lokalizacji, mikrofonu i kamery, w Logcat pojawi się ten komunikat:
Foreground service started from background can not have \ location/camera/microphone access: service SERVICE_NAME