前台服务超时

如果应用以 Android 15 或更高版本为目标平台,系统会限制某些前台服务在应用处于后台时可以运行的时长。目前,此限制仅适用于 dataSync 和 mediaProcessing 前台服务类型前台服务。shortService 前台服务类型有更严格的限制,这些限制将在该服务类型的文档中讨论。

超时行为

系统允许 dataSync 和 mediaProcessing 前台服务在 24 小时内总共运行 6 小时,之后系统会调用正在运行的服务的 Service.onTimeout(int, int) 方法(在 Android 15 中引入)。(mediaProcessing 前台服务类型是在 Android 15 中添加的。)系统会分别跟踪 dataSync 和 mediaProcessing 服务的 6 小时时间限制。例如,如果 dataSync 服务仅运行了 1 小时,则应用只有 5 小时可用于 dataSync 前台服务,但有整整 6 小时可用于 mediaProcessing 服务。

当前台服务达到 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]"

为避免此行为变更带来的问题,您可以执行以下一项或多项操作:

  1. 让您的服务实现新的 Service.onTimeout(int, int) 方法。 当应用收到回调时,请务必在几秒钟内调用 stopSelf()。(如果您不立即停止应用,系统会生成故障。)
  2. 确保应用的 dataSync 和 mediaProcessing 服务在任意 24 小时内的总运行时间不超过 6 小时(除非用户与应用互动,重置计时器)。
  3. 仅在用户直接互动时启动 dataSync 或 mediaProcessing 前台服务;由于您的应用在服务启动时处于前台,因此在应用进入后台后,您的服务有整整 6 个小时的时间。
  4. 请改用替代 API(例如 WorkManager),而不是使用这些前台服务。具体而言,请考虑使用替代 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