Jeśli aplikacja jest kierowana na Androida 15 lub nowszego, system nakłada ograniczenia na czas działania niektórych usług na pierwszym planie, gdy aplikacja działa w tle. Obecnie to ograniczenie dotyczy tylko usług działających na pierwszym planie typu dataSync
i mediaProcessing
. W przypadku shortService
usług działających na pierwszym planie obowiązują bardziej restrykcyjne limity, które zostały omówione w dokumentacji tego typu usługi.
Działanie w przypadku upłynięcia czasu oczekiwania
System zezwala na działanie usług na pierwszym planie dataSync
i mediaProcessing
przez łącznie 6 godzin w ciągu 24 godzin. Po tym czasie system wywołuje metodę Service.onTimeout(int, int)
działającej usługi (wprowadzoną w Androidzie 15). (mediaProcessing
Typ usługi na pierwszym planie został dodany w Androidzie 15). Sześciogodzinny limit czasu jest śledzony oddzielnie w przypadku usług dataSync
i mediaProcessing
. Jeśli na przykład usługa dataSync
działała przez godzinę, aplikacja będzie miała tylko 5 godzin na usługi dataSync
działające na pierwszym planie, ale będzie miała pełne 6 godzin na usługi mediaProcessing
.
Gdy usługa działająca na pierwszym planie osiągnie limit 6 godzin, ma kilka sekund na wywołanie funkcji Service.stopSelf()
. Gdy system wywoła Service.onTimeout()
, usługa nie jest już traktowana jako usługa działająca na pierwszym planie.
Jeśli usługa nie wywoła funkcji Service.stopSelf()
, system zgłosi wewnętrzny wyjątek. 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ą, możesz wykonać co najmniej jedną z tych czynności:
- Wdrożenie w usłudze nowej metody
Service.onTimeout(int, int)
. Gdy aplikacja otrzyma wywołanie zwrotne, wywołaj 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 Twojej aplikacji nie działają łącznie dłużej niż 6 godzin w ciągu 24 godzin (chyba że użytkownik wchodzi w interakcję z aplikacją, co resetuje licznik czasu). - Usługi działające na pierwszym planie
dataSync
lubmediaProcessing
uruchamiaj tylko w wyniku bezpośredniej interakcji użytkownika. Ponieważ w momencie uruchomienia usługi aplikacja działa na pierwszym planie, usługa ma pełne 6 godzin po przejściu aplikacji w tło. - Zamiast tych usług na pierwszym planie używaj alternatywnego interfejsu API, np. WorkManager. Zamiast usługi na pierwszym planie rozważ użycie alternatywnego interfejsu API.
dataSync
Jeśli usługi na pierwszym planie dataSync
w Twojej aplikacji działały przez 6 godzin w ciągu ostatnich 24 godzin, nie możesz uruchomić kolejnej usługi na pierwszym planie dataSync
, chyba że użytkownik przeniósł aplikację na pierwszy plan (co resetuje licznik czasu). Jeśli spróbujesz uruchomić kolejną dataSync
usługę działającą na pierwszym planie, system zgłosi ForegroundServiceStartNotAllowedException
z komunikatem o błędzie, np. „Time limit already exhausted for foreground service
type dataSync” (Limit czasu dla usługi działającej na pierwszym planie typu dataSync został już wyczerpany).
Testowanie
Aby przetestować działanie aplikacji, możesz włączyć limity czasu synchronizacji danych, nawet jeśli nie jest ona 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ć okres oczekiwania, aby łatwiej było sprawdzić, jak aplikacja zachowuje się po osiągnięciu limitu. Aby ustawić nowy okres limitu czasu dla dataSync
usług działających 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 na pierwszym planie mediaProcessing
, uruchom to polecenie:
adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds