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 dataSync i mediaProcessing usług na pierwszym planie typu na pierwszym planie usług. W przypadku usług na pierwszym planie typu shortService foreground service type obowiązują bardziej restrykcyjne limity, które zostały opisane 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 typu 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). (Usługa na pierwszym planie typu mediaProcessing została dodana w Androidzie 15). 6-godzinny 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 na pierwszym planie typu dataSync, ale będzie miała pełne 6 godzin na usługi mediaProcessing.

Gdy usługa na pierwszym planie osiągnie 6-godzinny limit, ma kilka sekund na wywołanie metody Service.stopSelf(). Gdy system wywoła metodę Service.onTimeout(), usługa nie jest już uważana za usługę na pierwszym planie. Jeśli usługa nie wywoła metody 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 ze zmianą tego działania, możesz wykonać co najmniej jedną z tych czynności:

  1. Zaimplementuj w usłudze nową metodę Service.onTimeout(int, int). Gdy aplikacja otrzyma wywołanie zwrotne, wywołaj metodę stopSelf() w ciągu kilku sekund. (Jeśli nie zatrzymasz aplikacji od razu, system wygeneruje błąd).
  2. Upewnij się, że usługi dataSync i mediaProcessing w 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 powoduje zresetowanie licznika).
  3. Uruchamiaj usługi na pierwszym planie typu dataSync lub mediaProcessing tylko w wyniku bezpośredniej interakcji użytkownika. Ponieważ aplikacja jest na pierwszym planie, gdy usługa się uruchamia, usługa ma pełne 6 godzin po przejściu aplikacji w tle.
  4. Zamiast tych usług na pierwszym planie użyj alternatywnego interfejsu API, np. WorkManager. W szczególności zamiast usługi na pierwszym planie typu dataSync rozważ użycie alternatywnego interfejsu API.

Jeśli usługi na pierwszym planie typu dataSync w aplikacji działały przez 6 godzin w ciągu ostatnich 24 godzin, nie możesz uruchomić kolejnej usługi na pierwszym planie typu dataSync, chyba że użytkownik przełączył aplikację na pierwszy plan (co powoduje zresetowanie licznika). Jeśli spróbujesz uruchomić inną usługę na pierwszym planie typu dataSync, system zgłosi wyjątek ForegroundServiceStartNotAllowedExceptionz komunikatem o błędzie, takim jak „Time limit already exhausted for foreground service type dataSync” (Limit czasu dla usługi 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 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ć limit czasu, aby łatwiej było przetestować, jak aplikacja zachowuje się po osiągnięciu limitu. Aby ustawić nowy limit czasu dla usług na pierwszym planie typu dataSync, uruchom to polecenie adb:

adb shell device_config put activity_manager data_sync_fgs_timeout_duration duration-in-milliseconds

Aby ustawić nowy limit czasu dla usług na pierwszym planie typu mediaProcessing, uruchom to polecenie:

adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds