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 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 dataSyncmediaProcessing. W przypadku shortServiceusł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 dataSyncmediaProcessing 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). (mediaProcessingTyp usługi na pierwszym planie został dodany w Androidzie 15). Sześciogodzinny limit czasu jest śledzony oddzielnie w przypadku usług dataSyncmediaProcessing. 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:

  1. 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).
  2. Upewnij się, że usługi dataSyncmediaProcessing 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).
  3. Usługi działające na pierwszym planie dataSync lub mediaProcessing 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.
  4. 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ą dataSyncusł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 dataSyncusł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