为了降低功耗,Android 8.0(API 级别 26)限制了应用在后台运行时检索用户当前位置信息的频率。在这些条件下,应用每小时只能接收几次位置信息更新。
注意:这些限制适用于在 Android 8.0(API 级别 26)或更高版本设备上使用的所有应用,无论应用的目标 SDK 版本是什么。
如果您的应用在后台运行时依赖实时警报或运动检测,则此位置信息检索行为尤其重要。
前景应用行为保持不变
如果应用在运行 Android 8.0(API 级别 26)的设备上处于前台,则位置信息更新行为与 Android 7.1.1(API 级别 25)及更低版本相同。
警告:如果您的应用长时间检索接近实时的位置信息更新,设备的电池续航时间会明显缩短。
调整应用的位置信息行为
考虑一下,如果您的应用接收位置信息更新不频繁,其在后台运行的用例是否完全无法成功。如果是这种情况,您可以通过执行以下操作之一来更频繁地检索位置信息更新:
- 将应用切换到前台。
-
通过调用
startForegroundService()
在您的应用中启动前台服务。当前台服务处于活动状态时,它会在通知区域显示为持续通知。注意:如果您的应用在后台运行时,在运行 Android 11(API 级别 30)或更高版本的设备上启动前台服务,则除非用户已向您的应用授予
ACCESS_BACKGROUND_LOCATION
权限,否则您的应用无法访问位置信息。如需了解更多信息,请查看与前台服务相关的使用中限制的指导。 - 使用地理围栏 API 的元素,例如
GeofencingClient
,它们经过优化以最大限度地降低功耗。 - 使用被动位置监听器,如果前台应用以更快的速度请求位置信息更新,该监听器可能会接收到更快的位置信息更新。
注意:如果您的应用需要访问包含高频更新的位置历史记录,请使用融合位置提供程序 API 元素的批处理版本,例如 FusedLocationProviderApi
接口。当您的应用在后台运行时,此 API 比非批处理 API 更频繁地接收用户位置信息。但是,请记住,您的应用仍然每小时只能接收几次批量更新。
受影响的 API
后台应用位置信息检索行为的更改会影响以下 API:
- 融合位置提供程序 (FLP)
-
-
如果您的应用在后台运行,位置信息系统服务每小时只会为您的应用计算几次新位置。即使您的应用请求更频繁的位置信息更新也是如此。
但是,通过使用 FLP 的批处理版本,您可以在应用接收批量更新后访问更多高频位置历史记录,而批量更新也每小时只会发生几次。
- 如果您的应用在前台运行,与 Android 7.1.1(API 级别 25)相比,位置信息采样率没有变化。
-
- 地理围栏
-
- 后台应用可以比融合位置提供程序的更新更频繁地接收地理围栏转换事件。
- 地理围栏事件的平均响应时间大约每隔几分钟。
- GNSS 测量和 GNSS 导航消息
-
- 当您的应用在后台时,注册接收
GnssMeasurement
和GnssNavigationMessage
输出的回调将停止执行。
- 当您的应用在后台时,注册接收
- 位置管理器
-
-
位置信息更新每小时仅向后台应用提供几次。
注意:如果您的应用在安装了 Google Play 服务的设备上运行,则强烈建议您改用融合位置提供程序 (FLP)。
-
- Wi-Fi 管理器
startScan()
方法每小时仅为后台应用执行几次完整扫描。如果后台应用不久后再次调用该方法,WifiManager
类会提供上次扫描的缓存结果。