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, thì hệ thống sẽ đặt các quy định hạn chế về thời lượng cho phép chạy một số dịch vụ trên nền trước trong khi ứng dụng của bạn đang 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 dataSyncloạ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 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 (đượ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:

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