如果应用以 Android 15 或更高版本为目标平台,系统会对某些前台服务在应用在后台运行时允许运行的时长施加限制。目前,此限制仅适用于 dataSync
和 mediaProcessing
前台服务类型前台服务。shortService
前台服务类型受到更严格的限制,详情请参阅该服务类型的文档。
超时行为
系统允许 dataSync
和 mediaProcessing
前台服务在 24 小时内总共运行 6 小时,之后系统会调用正在运行的服务的 Service.onTimeout(int, int)
方法(在 Android 15 中引入)。(Android 15 中添加了 mediaProcessing
前台服务类型。)系统会分别跟踪 dataSync
和 mediaProcessing
服务的 6 小时时限。例如,如果 dataSync
服务仅运行了一小时,则应用仅有 5 小时可用于 mediaProcessing
前台服务,而 dataSync
服务则有整六个小时的可用时间。
当某项前台服务的时限达到 6 小时时,该服务有几秒钟时间来调用 Service.stopSelf()
。当系统调用 Service.onTimeout()
时,该服务将不再被视为前台服务。如果服务未调用 Service.stopSelf()
,系统会抛出内部异常。系统会在 Logcat 中记录该异常,并附带以下消息:
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type [service type] did not stop within its timeout: [component name]"
为避免因行为变更而导致问题,您可以执行以下一项或多项操作:
- 让您的服务实现新的
Service.onTimeout(int, int)
方法。当您的应用收到回调时,请务必在几秒钟内调用stopSelf()
。(如果您未立即停止应用,系统会生成失败情况。) - 确保应用的
dataSync
和mediaProcessing
服务在任何 24 小时内的运行时间都不超过 6 小时(除非用户与应用互动并重置计时器)。 - 仅在用户直接互动时启动
dataSync
或mediaProcessing
前台服务;由于服务启动时应用位于前台,因此您的服务在应用进入后台后有完整的 6 小时时间。 - 请使用 WorkManager 等替代 API,而不是使用这些前台服务。特别是,请考虑使用替代 API,而不是使用
dataSync
前台服务。
如果您的应用的 dataSync
前台服务在过去 24 小时内运行了 6 小时,则您无法启动其他 dataSync
前台服务,除非用户已将您的应用切换到前台(这会重置计时器)。如果您尝试启动其他 dataSync
前台服务,系统会抛出 ForegroundServiceStartNotAllowedException
,并显示类似“前台服务类型 dataSync 的时间限制已用尽”的错误消息。
测试
如需测试应用的行为,您可以启用数据同步超时功能,即使应用未以 Android 15 为目标平台也是如此(前提是应用在 Android 15 设备上运行)。如需启用超时,请运行以下 adb
命令:
adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name
您还可以调整超时期限,以便更轻松地测试应用在达到上限时的行为方式。如需为 dataSync
前台服务设置新的超时期限,请运行以下 adb
命令:
adb shell device_config put activity_manager data_sync_fgs_timeout_duration duration-in-milliseconds
如需为 mediaProcessing
前台服务设置新的超时期限,请运行以下命令:
adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds