前台服务超时

如果应用的目标是 Android 15 或更高版本,则系统会对某些前台服务在您的应用处于后台时允许运行的时长施加限制。目前,此限制仅适用于 dataSyncmediaProcessing 前台服务类型 前台服务。对 shortService 前台服务类型 存在更严格的限制,将在该服务类型的文档中进行讨论。

超时行为

系统允许 dataSyncmediaProcessing 前台服务在 24 小时内总共运行 6 个小时,之后系统会调用正在运行的服务的 Service.onTimeout(int, int) 方法(在 Android 15 中引入)。(mediaProcessing 前台服务类型是在 Android 15 中添加的。)对 dataSyncmediaProcessing 服务分别跟踪 6 个小时的时间限制。例如,如果 dataSync 服务刚刚运行了一个小时,则应用将只有 5 个小时可用于 mediaProcessing 前台服务,但将有整整 6 个小时可用于 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]"

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

  1. 让您的服务实现新的 Service.onTimeout(int, int) 方法。当您的应用收到回调时,请确保在几秒钟内调用 stopSelf()。(如果您没有立即停止应用,系统会生成错误。)
  2. 确保您的应用的 dataSyncmediaProcessing 服务在任何 24 小时内总共运行不超过 6 个小时(除非用户与应用交互,从而重置计时器)。
  3. 仅在直接用户交互的结果下才启动 dataSyncmediaProcessing 前台服务;由于您的应用在服务启动时处于前台,因此您的服务在应用转到后台后将有整整 6 个小时可用。
  4. 不要使用这些前台服务,而是使用 替代 API,例如 WorkManager。特别是,不要使用 dataSync 前台服务,而是考虑使用 替代 API

如果您的应用的 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