Hết thời gian chờ dịch vụ trên nền trước

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 dataSyncmediaProcessing đố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 dataSyncmediaProcessing 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ụ dataSyncmediaProcessing. 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:

  1. 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ọi stopSelf() 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.)
  2. Đảm bảo các dịch vụ dataSyncmediaProcessing 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ờ).
  3. Chỉ bắt đầu dịch vụ trên nền trước dataSync hoặc mediaProcessing 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.
  4. 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