Aplikacje kierowane na Androida 12 (poziom API 31) lub nowszego nie mogą uruchamiać usług na pierwszym planie
, gdy działają w tle, z wyjątkiem kilku szczególnych
przypadków. Jeśli aplikacja spróbuje uruchomić usługę na pierwszym planie, gdy działa w tle, a usługa ta nie spełnia żadnego z wyjątków, system zgłosi wyjątek ForegroundServiceStartNotAllowedException.
Ponadto jeśli aplikacja chce uruchomić usługę na pierwszym planie, która wymaga uprawnień podczas używania (np. uprawnień do czujnika ciała, aparatu, mikrofonu lub lokalizacji), nie może utworzyć tej usługi, gdy działa w tle, nawet jeśli podlega jednemu z wyjątków od ograniczeń dotyczących uruchamiania w tle. Przyczynę tego wyjaśniamy w sekcji Ograniczenia dotyczące uruchamiania usług na pierwszym planie, które wymagają uprawnień podczas używania .
Wyjątki od ograniczeń dotyczących uruchamiania w tle
W tych sytuacjach aplikacja może uruchamiać usługi na pierwszym planie, nawet gdy działa w tle:
- Aplikacja przechodzi ze stanu widocznego dla użytkownika, np. z aktywności.
- Aplikacja może uruchomić aktywność w tle, z wyjątkiem sytuacji gdy ma aktywność w stosie wstecznym istniejącego zadania.
Aplikacja otrzymuje wiadomość o wysokim priorytecie za pomocą Komunikacji w chmurze Firebase.
Użytkownik wykonuje działanie na elemencie interfejsu związanym z Twoją aplikacją. Może to być np. interakcja z dymkiem, powiadomieniem, widżetem lub aktywnością.
Aplikacja wywołuje alarm precyzyjny, aby wykonać działanie, o które prosi użytkownik.
Twoja aplikacja jest bieżącą metodą wprowadzania danych na urządzeniu.
Twoja aplikacja otrzymuje zdarzenie związane z geofencingiem lub przejściem rozpoznawania aktywności.
Po ponownym uruchomieniu urządzenia i otrzymaniu działania intencji
ACTION_BOOT_COMPLETED,ACTION_LOCKED_BOOT_COMPLETED, lubACTION_MY_PACKAGE_REPLACEDw odbiorniku.Twoja aplikacja otrzymuje działanie intencji
ACTION_TIMEZONE_CHANGED,ACTION_TIME_CHANGED, lubACTION_LOCALE_CHANGEDw odbiorniku.Twoja aplikacja otrzymuje zdarzenie
ACTION_TRANSACTION_DETECTEDzNfcService.Aplikacje z określonymi rolami systemowymi lub uprawnieniami, np. właściciele urządzeń i właściciele profili.
Twoja aplikacja korzysta z Menedżera urządzeń towarzyszących i deklaruje uprawnienie
REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUNDlub uprawnienieREQUEST_COMPANION_RUN_IN_BACKGROUND. Jeśli to możliwe, używaj uprawnieniaREQUEST_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_WINDOWoraz widoczne okno nakładki.
Ograniczenia dotyczące uruchamiania usług na pierwszym planie, które wymagają uprawnień podczas używania
W Androidzie 14 (poziom API 34) lub nowszym obowiązują specjalne zasady, o których musisz pamiętać, jeśli uruchamiasz usługę na pierwszym planie, która wymaga uprawnień podczas używania.
Jeśli Twoja aplikacja jest kierowana na Androida 14 lub nowszego, system operacyjny sprawdza podczas tworzenia usługi na pierwszym planie, czy aplikacja ma wszystkie odpowiednie uprawnienia dla danego typu usługi. Na przykład gdy tworzysz usługę na pierwszym planie typu
mikrofon, system operacyjny sprawdza, czy Twoja aplikacja ma obecnie uprawnienie
RECORD_AUDIO. Jeśli nie masz tego uprawnienia, system zgłosi wyjątek
SecurityException.
W przypadku uprawnień podczas używania może to spowodować problem. Jeśli Twoja aplikacja ma uprawnienie podczas używania, ma je tylko gdy działa na pierwszym planie. Oznacza to, że jeśli Twoja aplikacja działa w tle i próbuje utworzyć usługę na pierwszym planie typu aparat, lokalizacja lub mikrofon, system stwierdzi, że Twoja aplikacja obecnie nie ma wymaganych uprawnień, i zgłosi wyjątek SecurityException.
Podobnie jeśli Twoja aplikacja działa w tle i tworzy usługę zdrowotną, która wymaga uprawnienia BODY_SENSORS, aplikacja nie ma obecnie tego uprawnienia, a system zgłosi wyjątek.
(Nie dotyczy to usługi zdrowotnej, która wymaga innych uprawnień,
jak ACTIVITY_RECOGNITION.) Wywołanie
PermissionChecker.checkSelfPermission()
nie zapobiega temu problemowi. Jeśli Twoja aplikacja ma uprawnienie podczas używania i wywołuje metodę checkSelfPermission() w celu sprawdzenia, czy ma to uprawnienie, metoda zwraca wartość PERMISSION_GRANTED nawet wtedy, gdy aplikacja działa w tle. Gdy metoda zwraca wartość PERMISSION_GRANTED, oznacza to, że „Twoja aplikacja ma to uprawnienie podczas używania”.
Z tego powodu, jeśli Twoja usługa na pierwszym planie wymaga uprawnienia podczas używania, musisz wywołać metodę Context.startForegroundService() lub Context.bindService() wtedy, gdy Twoja aplikacja ma widoczną aktywność, chyba że usługa podlega jednemu z określonych wyjątków.
Wyjątki od ograniczeń dotyczących uprawnień podczas używania
W niektórych sytuacjach, nawet jeśli usługa na pierwszym planie zostanie uruchomiona, gdy aplikacja działa w tle, może ona nadal uzyskiwać dostęp do informacji o lokalizacji, aparacie 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
jako location i jest uruchamiana przez aplikację, która
ma uprawnienie ACCESS_BACKGROUND_LOCATION
, ta usługa może mieć dostęp do informacji o lokalizacji przez cały czas, nawet gdy
aplikacja działa w tle.
Poniżej znajdziesz listę tych sytuacji:
- Usługa jest uruchamiana przez komponent systemu.
- Usługa jest uruchamiana przez interakcję z widżetami aplikacji.
- Usługa jest uruchamiana przez interakcję z powiadomieniem.
- Usługa jest uruchamiana jako
PendingIntentwysłany z innej, widocznej aplikacji. - Usługa jest uruchamiana przez aplikację, która jest kontrolerem zasad dotyczących urządzeń działającym w trybie właściciela urządzenia.
- Usługa jest uruchamiana przez aplikację, która udostępnia
VoiceInteractionService. - Usługa jest uruchamiana przez aplikację, która ma uprzywilejowane uprawnienie
START_ACTIVITIES_FROM_BACKGROUND.
Określanie, których usług dotyczy problem w Twojej aplikacji
Podczas testowania aplikacji uruchom jej usługi na pierwszym planie. Jeśli uruchomiona usługa ma ograniczony dostęp do lokalizacji, mikrofonu i aparatu, w Logcat pojawi się ten komunikat:
Foreground service started from background can not have \ location/camera/microphone access: service SERVICE_NAME