如果应用的目标平台为 Android 15 或更高版本,系统会限制某些前台服务在应用处于后台时允许运行的时长。目前,此限制仅适用于 dataSync
和 mediaProcessing
前台服务类型 前台服务。对 shortService
前台服务类型 的限制更为严格,相关内容在该服务类型的文档中进行了讨论。
超时行为
系统允许 dataSync
和 mediaProcessing
前台服务在 24 小时内总共运行 6 小时,之后系统会调用正在运行的服务的 Service.onTimeout(int, int)
方法(在 Android 15 中引入)。(mediaProcessing
前台服务类型是在 Android 15 中添加的。)对 dataSync
和 mediaProcessing
服务分别跟踪六小时的时间限制。例如,如果 dataSync
服务刚刚运行了一小时,则该应用只有五小时可用于 mediaProcessing
前台服务,但它将有整整六小时可用于 dataSync
服务。
当前台服务达到六小时的限制时,服务有几秒钟的时间来调用 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
前台服务;由于您的应用在服务启动时处于前台,因此您的服务在应用转到后台后将有完整的六小时可用。 - 不要使用这些前台服务,请使用替代 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