Jeśli aplikacja jest kierowana na Androida 15 lub nowszego, system nakłada ograniczenia na to, jak długo mogą działać określone usługi na pierwszym planie, gdy aplikacja działa w tle. Obecnie to ograniczenie dotyczy tylko usług typu dataSync
i mediaProcessing
działających na pierwszym planie. W przypadku shortService
typu usługi działającej na pierwszym planie obowiązują bardziej restrykcyjne limity, o których mowa w dokumentacji tego typu usługi.
Zachowanie w przypadku upłynięcia limitu czasu
System zezwala usługom na pierwszym planie typu dataSync
i mediaProcessing
na działanie przez łącznie 6 godzin w ciągu 24 godzin, po czym wywołuje metodę Service.onTimeout(int, int)
działającej usługi (wprowadzoną w Androidzie 15). (Typ usługi na pierwszym planie mediaProcessing
został dodany w Androidzie 15). 6-godzinny limit czasu jest śledzony osobno w przypadku usług dataSync
i mediaProcessing
. Jeśli na przykład usługa dataSync
działała przez godzinę, aplikacja miałaby do dyspozycji tylko 5 godzin na usługi mediaProcessing
na pierwszym planie, ale 6 godzin na usługi dataSync
.
Gdy usługa na pierwszym planie osiągnie limit 6 godzin, ma kilka sekund na wywołanie usługi Service.stopSelf()
. Gdy system wywoła Service.onTimeout()
, usługa przestaje być uznawana za usługę na pierwszym planie.
Jeśli usługa nie wywoła funkcji Service.stopSelf()
, system zgłosi wyjątek wewnętrzny. Wyjątek jest rejestrowany w Logcat z tym komunikatem:
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type [service type] did not stop within its timeout: [component name]"
Aby uniknąć problemów związanych z tą zmianą zachowania, możesz wykonać co najmniej jedną z tych czynności:
- Pozwól usłudze wdrożyć nową metodę
Service.onTimeout(int, int)
. Gdy Twoja aplikacja otrzyma wywołanie zwrotne, pamiętaj, aby wywołać funkcjęstopSelf()
w ciągu kilku sekund. (jeśli nie zatrzymasz aplikacji od razu, system wygeneruje błąd). - Upewnij się, że usługi
dataSync
imediaProcessing
w aplikacji nie działają dłużej niż 6 godzin w ciągu 24 godzin (chyba że użytkownik wchodzi w interakcję z aplikacją, resetując w ten sposób minutnik). - Uruchamiaj usługi
dataSync
lubmediaProcessing
na pierwszym planie tylko w wyniku bezpośredniej interakcji z użytkownikiem. Ponieważ podczas uruchamiania usługi aplikacja jest na pierwszym planie, po przejściu aplikacji w stan w tle usługa ma do dyspozycji pełne 6 godzin. - Zamiast tych usług na pierwszym planie użyj alternatywnego interfejsu API, takiego jak WorkManager. Zamiast
dataSync
usługi na pierwszym planie rozważ użycie alternatywnego interfejsu API.
Jeśli usługi działające na pierwszym planie dataSync
w Twojej aplikacji były uruchomione na pierwszym planie przez 6 godzin w ciągu ostatnich 24 godzin, nie możesz uruchomić kolejnej usługi dataSync
na pierwszym planie, chyba że użytkownik przeniósł aplikację na pierwszy plan (co spowoduje zresetowanie licznika). Jeśli spróbujesz uruchomić inną usługę dataSync
na pierwszym planie, system wyświetli komunikat o błędzie, np. „Czas limitu został już wyczerpany dla usługi na pierwszym planie typu dataSync”.ForegroundServiceStartNotAllowedException
Testowanie
Aby przetestować działanie aplikacji, możesz włączyć czas oczekiwania na synchronizację danych, nawet jeśli aplikacja nie jest kierowana na Androida 15 (o ile działa na urządzeniu z Androidem 15). Aby włączyć limity czasu, uruchom to polecenie adb
:
adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name
Możesz też dostosować czas oczekiwania, aby łatwiej testować działanie aplikacji po osiągnięciu limitu. Aby ustawić nowy czas oczekiwania dla dataSync
usług na pierwszym planie, uruchom to polecenie adb
:
adb shell device_config put activity_manager data_sync_fgs_timeout_duration duration-in-milliseconds
Aby ustawić nowy okres oczekiwania dla usług mediaProcessing
na pierwszym planie, uruchom to polecenie:
adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds