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 próbuje uruchomić usługę na pierwszym planie, gdy działa w tle, a usługa na pierwszym planie nie spełnia warunków 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ń podczas używania (np. uprawnień do czujnika biometrycznego, aparatu, mikrofonu lub lokalizacji), nie może utworzyć usługi, gdy działa w tle, nawet jeśli jest objęta jednym ze zwolnień z ograniczeń dotyczących uruchamiania w tle. Powód został wyjaśniony 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. aktywności.
- Aplikacja może rozpocząć aktywność w tle, chyba że ma aktywność na 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 na przykład wejść w interakcję 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 obecnie metodą wprowadzania na urządzeniu.
Aplikacja otrzymuje zdarzenie związane z geofencingiem lub przejściem do rozpoznawania aktywności.
Po ponownym uruchomieniu urządzenia i odebraniu działania intencji
ACTION_BOOT_COMPLETED,ACTION_LOCKED_BOOT_COMPLETEDlubACTION_MY_PACKAGE_REPLACEDw odbiorniku komunikatów.Twoja aplikacja otrzymuje działanie intencji
ACTION_TIMEZONE_CHANGED,ACTION_TIME_CHANGEDlubACTION_LOCALE_CHANGEDw odbiorniku komunikatów.Aplikacja otrzymuje zdarzenie
ACTION_TRANSACTION_DETECTEDzNfcService.aplikacje z określonymi rolami lub uprawnieniami systemowymi, np. właściciele urządzeń i właściciele profili;
Twoja aplikacja używa Menedżera urządzeń towarzyszących i deklaruje uprawnienie
REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUNDlubREQUEST_COMPANION_RUN_IN_BACKGROUND. W miarę możliwości używajREQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND.Użytkownik wyłączy optymalizację baterii w przypadku Twojej aplikacji.
Twoja aplikacja ma uprawnienie
SYSTEM_ALERT_WINDOW. Uwaga: jeśli aplikacja jest kierowana na Androida 15 lub nowszego, musi mieć uprawnienieSYSTEM_ALERT_WINDOWoraz musi mieć obecnie widoczne okno nakładki.
Ograniczenia dotyczące uruchamiania usług działających na pierwszym planie, które wymagają uprawnień podczas używania
W przypadku Androida 14 (API na poziomie 34) lub nowszego należy pamiętać o szczególnych sytuacjach, jeśli uruchamiasz usługę działającą na pierwszym planie, która wymaga uprawnień podczas używania.
Jeśli Twoja aplikacja jest kierowana na Androida 14 lub nowszego, system operacyjny sprawdza, czy podczas tworzenia usługi na pierwszym planie aplikacja ma wszystkie odpowiednie uprawnienia dla tego typu usługi. Na przykład gdy tworzysz usługę na pierwszym planie typu mikrofon, system operacyjny sprawdza, czy aplikacja ma obecnie uprawnienie RECORD_AUDIO. Jeśli nie masz tego uprawnienia, system wyświetli błąd SecurityException.
W przypadku uprawnień „podczas używania” może to powodować problemy. Jeśli aplikacja ma uprawnienie „podczas używania”, ma je tylko wtedy, gdy działa na pierwszym planie. Oznacza to, że jeśli aplikacja działa w tle i próbuje utworzyć usługę na pierwszym planie typu aparat, lokalizacja lub mikrofon, system widzi, że aplikacja obecnie nie ma wymaganych uprawnień, i wyświetla błąd SecurityException.
Podobnie, jeśli aplikacja działa w tle i tworzy funkcje dotyczące zdrowia, które wymagają uprawnienia BODY_SENSORS, aplikacja nie ma obecnie tego uprawnienia, a system zgłasza wyjątek.
(Nie dotyczy to funkcji dotyczących zdrowia, które wymagają innych uprawnień, takich jak ACTIVITY_RECOGNITION). Wywołanie PermissionChecker.checkSelfPermission() nie zapobiega temu problemowi. Jeśli aplikacja ma uprawnienie „podczas używania” i wywołuje metodę checkSelfPermission(), aby sprawdzić, czy ma to uprawnienie, metoda zwraca PERMISSION_GRANTED, nawet jeśli aplikacja działa w tle. Gdy metoda zwraca wartość PERMISSION_GRANTED, oznacza to, że aplikacja ma to uprawnienie, gdy jest używana.
Z tego powodu, jeśli usługa na pierwszym planie wymaga uprawnienia „podczas używania”, musisz wywołać Context.startForegroundService() lub Context.bindService(), gdy aplikacja ma widoczną aktywność, chyba że usługa jest objęta jednym ze zdefiniowanych 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, może ona uzyskiwać dostęp do informacji o lokalizacji przez cały czas, nawet gdy aplikacja działa w tle.
Oto lista takich sytuacji:
- Komponent systemowy uruchamia usługę.
- Usługa uruchamia się, gdy użytkownik wchodzi w interakcję z widżetami aplikacji.
- Usługa rozpoczyna się od interakcji z powiadomieniem.
- Usługa uruchamia się jako
PendingIntentwysył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 uprawnienia uprzywilejowane
START_ACTIVITIES_FROM_BACKGROUND.
Określanie, których usług w aplikacji dotyczy problem
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 aparatu, w narzędziu Logcat pojawi się ten komunikat:
Foreground service started from background can not have \ location/camera/microphone access: service SERVICE_NAME