Limity czasu usług działających na pierwszym planie

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 dataSyncmediaProcessing 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 dataSyncmediaProcessing 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 mediaProcessing działającej na pierwszym planie został dodany w Androidzie 15). 6-godzinny limit czasu jest monitorowany oddzielnie w przypadku usług dataSync i mediaProcessing. Jeśli na przykład usługa dataSync działała tylko przez godzinę, dla aplikacji mediaProcessing dostępnych będzie tylko 5 godzin, ale na działanie usług dataSync będzie dostępnych pełne 6 godzin.

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 usługę Service.onTimeout(), nie będzie ona już 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:

  1. Zaimplementuj nową metodę Service.onTimeout(int, int) w swojej usłudze. Gdy aplikacja otrzyma połączenie zwrotne, w ciągu kilku sekund zadzwoń pod numer stopSelf(). (jeśli nie zatrzymasz aplikacji od razu, system wygeneruje błąd).
  2. Dopilnuj, aby usługi dataSync i mediaProcessing Twojej aplikacji nie działały przez łącznie 6 godzin w dowolnym 24-godzinnym okresie (chyba że użytkownik wejdzie w interakcję z aplikacją, resetując minutnik).
  3. Uruchamiaj tylko usługi na pierwszym planie dataSync lub mediaProcessing w wyniku bezpośredniej interakcji z użytkownikiem. Ponieważ aplikacja znajduje się na pierwszym planie w momencie uruchomienia usługi, usługa ma pełne 6 godzin od momentu jej uruchomienia w tle.
  4. Zamiast tych usług na pierwszym planie użyj alternatywnego interfejsu API, takiego jak WorkManager. Zamiast dataSyncusługi na pierwszym planie rozważ użycie alternatywnego interfejsu API.

Jeśli w ciągu ostatnich 24 godzin usługi dataSync na pierwszym planie Twojej aplikacji działały przez 6 godzin, nie możesz uruchomić innej usługi dataSync na pierwszym planie chyba że użytkownik przełączył aplikację na pierwszy plan (co spowoduje zresetowanie minutnika). Jeśli spróbujesz uruchomić inną usługę na pierwszym planie dataSync, system wygeneruje ForegroundServiceStartNotAllowedException z komunikatem o błędzie, np. „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 aplikacja nie jest kierowana na Androida 15 (o ile jest uruchomiona 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ć limit czasu 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