后台位置限制

为了减少功耗,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,这些元素经过优化,可以最大限度地减少功耗。
  • 使用被动位置侦听器,如果存在以更快速率请求位置更新的前台应用,则此侦听器可能会接收更快的位置更新。

注意:如果您的应用需要访问包含高频更新的位置历史记录,请使用 Fused Location Provider API 元素(例如FusedLocationProviderApi接口)的批量版本。当您的应用在后台运行时,此 API 比非批量 API 更频繁地接收用户的位置。但是,请记住,您的应用仍然只能每小时接收几次批量更新。

受影响的 API

后台应用中位置检索行为的更改会影响以下 API

融合位置提供程序 (FLP)
  • 如果您的应用在后台运行,则位置系统服务每小时仅为您的应用计算一个新位置。即使您的应用请求更频繁的位置更新,情况也是如此。

    但是,通过使用FLP 的批量版本,在您的应用接收批量更新后,您可以访问更频繁的时间位置历史记录,此批量更新也每小时只发生几次。

  • 如果您的应用在前台运行,则与 Android 7.1.1(API 级别 25)相比,位置采样率没有任何变化。
地理围栏
  • 后台应用可以比融合位置提供程序的更新更频繁地接收地理围栏转换事件。
  • 地理围栏事件的平均响应速度大约是每隔几分钟。
GNSS 测量和 GNSS 导航消息
位置管理器
  • 位置更新仅每小时向后台应用提供几次。

    注意:如果您的应用在安装了 Google Play 服务的设备上运行,强烈建议您使用融合位置提供程序 (FLP)

Wi-Fi 管理器
仅后台应用才能使用startScan()方法执行完全扫描,且每小时仅执行几次。如果后台应用随后很快再次调用此方法,WifiManager类将提供上次扫描的缓存结果。