Nếu một ứng dụng nhắm đến Android 15 trở lên, hệ thống sẽ hạn chế thời gian chạy của một số dịch vụ trên nền trước khi ứng dụng của bạn ở chế độ nền. Hiện tại, hạn chế này chỉ áp dụng cho loại dịch vụ trên nền trước dataSync
và mediaProcessing
đối với các dịch vụ trên nền trước. Có những hạn mức hạn chế hơn đối với loại dịch vụ trên nền trước shortService
. Các hạn mức này được đề cập trong tài liệu của loại dịch vụ đó.
Hành vi khi 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 (ra mắt trong Android 15). (Loại dịch vụ trên nền trước mediaProcessing
được thêm vào trong Android 15.) Giới hạn thời gian 6 giờ được theo dõi riêng cho các dịch vụ dataSync
và mediaProcessing
. Ví dụ: nếu dịch vụ dataSync
vừa chạy trong một giờ, thì ứng dụng sẽ chỉ còn 5 giờ cho các dịch vụ trên nền trước dataSync
, nhưng sẽ có đủ 6 giờ cho các dịch vụ mediaProcessing
.
Khi dịch vụ trên nền trước đạt đến giới hạn 6 giờ, dịch vụ này sẽ có vài giây để gọi Service.stopSelf()
. Khi hệ thống gọi Service.onTimeout()
, dịch vụ sẽ không còn được coi là dịch vụ trên nền trước nữa.
Nếu dịch vụ không gọi Service.stopSelf()
, hệ thống sẽ gửi ra một ngoại lệ nội bộ. Ngoại lệ được ghi vào nhật ký trong Logcat bằng 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 gặp vấn đề với thay đổi về hành vi này, bạn có thể thực hiện một hoặc nhiều việc sau:
- Dịch vụ của bạn phải 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òng 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 ra một lỗi.) - Đảm bảo các dịch vụ
dataSync
vàmediaProcessing
của ứng dụng không chạy quá tổng cộng 6 giờ trong khoảng thời gian 24 giờ (trừ phi 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 kết quả của hoạt động tương tác trực tiếp của người dùng; vì ứng dụng của bạn ở nền trước khi dịch vụ bắt đầu, nên dịch vụ của bạn có toàn bộ 6 giờ sau khi ứng dụng chuyển sang 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 (thao tác 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 một thông báo lỗi như "Đã hết thời gian cho dịch vụ trên nền trước thuộc loại 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 của bạn 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 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 sau:
adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds