Nếu một ứng dụng nhắm đến Android 15 trở lên, thì hệ thống sẽ đặt ra các hạn chế về thời gian chạy một số dịch vụ trên nền trước trong khi ứng dụng chạy ở chế độ nền. Hiện tại, quy định hạn chế này chỉ áp dụng cho các dịch vụ trên nền trước dataSync
và loại dịch vụ trên nền trước mediaProcessing
. Có các giới hạn hạn chế hơn đối với loại dịch vụ trên nền trước shortService
được thảo luận trong tài liệu của loại dịch vụ đó.
Hành vi hết thời gian chờ
Hệ thống cho phép các dịch vụ trên nền trước dataSync
và mediaProcessing
chạy tổng cộng 6 giờ trong khoảng thời gian 24 giờ, sau đó hệ thống sẽ gọi phương thức Service.onTimeout(int, int)
của dịch vụ đang chạy (được giới thiệu trong Android 15). (Loại dịch vụ trên nền trước mediaProcessing
đã được thêm vào Android 15.) Giới hạn thời gian 6 giờ được theo dõi riêng cho dataSync
và cho các dịch vụ mediaProcessing
. Ví dụ: nếu một dịch vụ dataSync
chỉ chạy trong một giờ, thì ứng dụng sẽ chỉ có 5 giờ cho các dịch vụ trên nền trước mediaProcessing
, nhưng sẽ có đủ 6 giờ cho các dịch vụ dataSync
.
Khi một dịch vụ trên nền trước đạt đến giới hạn 6 giờ, dịch vụ đó sẽ có vài giây để gọi Service.stopSelf()
. Khi hệ thống gọi Service.onTimeout()
, dịch vụ này sẽ không còn được coi là dịch vụ trên nền trước.
Nếu dịch vụ không gọi Service.stopSelf()
, hệ thống sẽ gửi một ngoại lệ nội bộ. Trường hợp ngoại lệ được ghi lại trong Logcat với thông báo sau:
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type [service type] did not stop within its timeout: [component name]"
Để tránh các vấn đề liên quan đến thay đổi về hành vi này, bạn có thể làm một hoặc nhiều việc sau:
- Yêu cầu dịch vụ triển khai phương thức
Service.onTimeout(int, int)
mới. Khi ứng dụng của bạn nhận được lệnh gọi lại, hãy nhớ gọistopSelf()
trong vài giây. (Nếu bạn không dừng ứng dụng ngay lập tức, hệ thống sẽ tạo lỗi.) - Đảm bảo rằng các dịch vụ
dataSync
vàmediaProcessing
của ứng dụng không chạy trong tổng thời gian quá 6 giờ trong bất kỳ khoảng thời gian 24 giờ nào (trừ khi người dùng tương tác với ứng dụng, đặt lại bộ hẹn giờ). - Chỉ bắt đầu dịch vụ trên nền trước
dataSync
hoặcmediaProcessing
do tương tác trực tiếp của người dùng; vì ứng dụng của bạn đang ở nền trước khi dịch vụ bắt đầu, nên dịch vụ của bạn có đủ 6 giờ sau khi ứng dụng chuyển sang chế độ nền. - Thay vì sử dụng các dịch vụ trên nền trước này, hãy sử dụng một API thay thế, chẳng hạn như WorkManager. Cụ thể, thay vì sử dụng dịch vụ trên nền trước
dataSync
, hãy cân nhắc sử dụng API thay thế.
Nếu các dịch vụ trên nền trước dataSync
của ứng dụng đã chạy trong 6 giờ trong 24 giờ qua, thì bạn không thể bắt đầu một dịch vụ trên nền trước dataSync
khác trừ phi người dùng đã đưa ứng dụng của bạn lên nền trước (điều này sẽ đặt lại bộ hẹn giờ). Nếu bạn cố gắng khởi động một dịch vụ trên nền trước dataSync
khác, hệ thống sẽ gửi ForegroundServiceStartNotAllowedException
kèm theo thông báo lỗi như "Đã hết thời gian giới hạn cho loại dịch vụ trên nền trước dataSync".
Thử nghiệm
Để kiểm thử hành vi của ứng dụng, bạn có thể bật thời gian chờ đồng bộ hoá dữ liệu ngay cả khi ứng dụng không nhắm đến Android 15 (miễn là ứng dụng đang chạy trên thiết bị Android 15). Để bật tính năng thời gian chờ, hãy chạy lệnh adb
sau:
adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name
Bạn cũng có thể điều chỉnh khoảng thời gian chờ để dễ dàng kiểm thử cách ứng dụng của bạn hoạt động khi đạt đến giới hạn. Để đặt khoảng thời gian chờ mới cho các dịch vụ trên nền trước dataSync
, hãy chạy lệnh adb
sau:
adb shell device_config put activity_manager data_sync_fgs_timeout_duration duration-in-milliseconds
Để đặt khoảng thời gian chờ mới cho các dịch vụ trên nền trước mediaProcessing
, hãy chạy lệnh này:
adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds