Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang
Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.
Nếu một ứng dụng nhắm đến Android 15 trở lên, hệ thống sẽ đặt ra các hạn chế về 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ụ này 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ọ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.)
Đả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ặ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.
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:
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:
Nội dung và mã mẫu trên trang này phải tuân thủ các giấy phép như mô tả trong phần Giấy phép nội dung. Java và OpenJDK là nhãn hiệu hoặc nhãn hiệu đã đăng ký của Oracle và/hoặc đơn vị liên kết của Oracle.
Cập nhật lần gần đây nhất: 2025-08-27 UTC.
[[["Dễ hiểu","easyToUnderstand","thumb-up"],["Giúp tôi giải quyết được vấn đề","solvedMyProblem","thumb-up"],["Khác","otherUp","thumb-up"]],[["Thiếu thông tin tôi cần","missingTheInformationINeed","thumb-down"],["Quá phức tạp/quá nhiều bước","tooComplicatedTooManySteps","thumb-down"],["Đã lỗi thời","outOfDate","thumb-down"],["Vấn đề về bản dịch","translationIssue","thumb-down"],["Vấn đề về mẫu/mã","samplesCodeIssue","thumb-down"],["Khác","otherDown","thumb-down"]],["Cập nhật lần gần đây nhất: 2025-08-27 UTC."],[],[],null,["If an app targets Android 15 or higher, the system places\nrestrictions on how long certain foreground services are allowed to run while\nyour app is in the background. Currently, this restriction only applies to\n[`dataSync`](/develop/background-work/services/fgs/service-types#data-sync) and\n[`mediaProcessing` foreground service type](/develop/background-work/services/fgs/service-types#media-processing) foreground\nservices. There are more restrictive limits on the [`shortService` foreground\nservice type](/develop/background-work/services/fgs/service-types#short-service) which are discussed in that service type's\ndocumentation.\n\nTimeout behavior\n\nThe system permits `dataSync` and `mediaProcessing` foreground services to run\nfor a total of 6 hours in a 24-hour period, after which the system calls the\nrunning service's [`Service.onTimeout(int, int)`](/reference/android/app/Service#onTimeout(int,%20int)) method\n(introduced in Android 15). (The `mediaProcessing` foreground\nservice type was added in Android 15.) The six-hour time limit is\ntracked separately for `dataSync` and for `mediaProcessing` services. For\nexample, if a `dataSync` service just ran for one hour, the app would only have\nfive hours available for `dataSync` foreground services, but it would\nhave a full six hours available for `mediaProcessing` services.\n| **Note:** `shortService` foreground services have a more restrictive time limit. For more information, see the [short service documentation](/develop/background-work/services/fgs/service-types#short-service).\n\nWhen a foreground service reaches the six-hour limit, the service has a few\nseconds to call [`Service.stopSelf()`](/reference/android/app/Service#stopSelf()). When the system calls\n`Service.onTimeout()`, the service is no longer considered a foreground service.\nIf the service does not call `Service.stopSelf()`, the system throws an internal\nexception. The exception is logged in [Logcat](/tools/logcat) with the following\nmessage: \n\n Fatal Exception: android.app.RemoteServiceException: \"A foreground service of\n type [service type] did not stop within its timeout: [component name]\"\n\n| **Note:** The 6-hour time limit is shared by all of an app's foreground services of the specified type. For example, if an app runs a `dataSync` service for four hours, then starts a different `dataSync` service, that second service will only be allowed to run for two hours. However, if the user brings the app to the foreground, the timer resets and the app has 6 hours available.\n\nTo avoid problems with this behavior change, you can do one or more of the\nfollowing:\n\n1. Have your service implement the new `Service.onTimeout(int, int)` method. When your app receives the callback, make sure to call `stopSelf()` within a few seconds. (If you don't stop the app right away, the system generates a failure.)\n2. Make sure your app's `dataSync` and `mediaProcessing` services don't run for more than a total of 6 hours in any 24-hour period (unless the user interacts with the app, resetting the timer).\n3. Only start `dataSync` or `mediaProcessing` foreground services as a result of direct user interaction; since your app is in the foreground when the service starts, your service has the full six hours after the app goes to the background.\n4. Instead of using these foreground services, use an use an [alternative\n API](/develop/background-work/background-tasks#alternative-apis), like WorkManager. In particular, instead of using a `dataSync` foreground service, consider using an [alternative API](/develop/background-work/background-tasks/data-transfer-options).\n\nIf your app's `dataSync` foreground services have run for 6 hours in the last\n24, you cannot start another `dataSync` foreground service *unless* the user\nhas brought your app to the foreground (which resets the timer). If you try to\nstart another `dataSync` foreground service, the system throws\n[`ForegroundServiceStartNotAllowedException`](/reference/android/app/ForegroundServiceStartNotAllowedException)\nwith an error message like \"Time limit already exhausted for foreground service\ntype dataSync\".\n\nTesting\n\nTo test your app's behavior, you can enable data sync timeouts even if your app\nis not targeting Android 15 (as long as the app is running on an Android 15\ndevice). To enable timeouts, run the following [`adb`](/tools/adb) command: \n\n adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS \u003cvar label=\"package-name\" translate=\"no\"\u003eyour-package-name\u003c/var\u003e\n\nYou can also adjust the timeout period, to make it easier to test how your\napp behaves when the limit is reached. To set a new timeout period for\n`dataSync` foreground services, run the following `adb` command: \n\n adb shell device_config put activity_manager data_sync_fgs_timeout_duration \u003cvar label=\"timeout-duration\" translate=\"no\"\u003eduration-in-milliseconds\u003c/var\u003e\n\nTo set a new timeout period for `mediaProcessing` foreground services, run this\ncommand: \n\n adb shell device_config put activity_manager media_processing_fgs_timeout_duration \u003cvar label=\"timeout-duration\" translate=\"no\"\u003eduration-in-milliseconds\u003c/var\u003e"]]