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 dataSync i mediaProcessing. W przypadku usługi działającej na pierwszym planie typu shortService 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 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). Limit 6 godzin jest śledzony osobno 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 do dyspozycji tylko 5 godzin na usługi dataSync na pierwszym planie, ale będzie miała do dyspozycji 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 metody Service.stopSelf(). Gdy system wywołuje metodę Service.onTimeout(), usługa nie jest już uznawana za usługę działającą na pierwszym planie. Jeśli usługa nie wywoła metody 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ą, 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, w ciągu kilku sekund wywołaj stopSelf(). (Jeśli nie zatrzymasz aplikacji od razu, system wygeneruje błąd).
  2. Upewnij się, że usługi dataSync i mediaProcessing Twojej aplikacji nie działają dłużej niż łącznie 6 godzin w ciągu 24 godzin (chyba że użytkownik wejdzie w interakcję z aplikacją, co spowoduje zresetowanie licznika czasu).
  3. Usługi na pierwszym planie dataSync lub mediaProcessing uruchamiaj 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 do tła.
  4. Zamiast tych usług na pierwszym planie użyj alternatywnego interfejsu API, takiego jak WorkManager. W szczególności zamiast usługi na pierwszym planie dataSync rozważ użycie alternatywnego interfejsu API.

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 przeniesie aplikację na pierwszy plan (co spowoduje zresetowanie licznika czasu). Jeśli spróbujesz uruchomić inną usługę działającą na pierwszym planie dataSync, system zgłasza błąd ForegroundServiceStartNotAllowedException z komunikatem o błędzie „Limit czasu 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 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 przetestować zachowanie aplikacji po osiągnięciu limitu. Aby ustawić nowy limit czasu dla usług dataSync 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 limit czasu 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