为了降低功耗,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
权限,否则应用无法访问位置信息。如需了解详情,请参阅有关与前台服务关联的使用时限制的指南。 -
使用 Geofencing API 的元素(例如
GeofencingClient
),这些元素经过了优化,可以最大限度地减少耗电量。 - 使用被动位置信息监听器,如果有前台应用以更快的频率请求位置信息更新,该监听器可以更快地接收位置信息更新。
注意:如果您的应用需要访问包含时间频繁更新的位置记录,请使用批处理版本的 Fused Location Provider API 元素,例如 FusedLocationProviderApi
接口。当您的应用在后台运行时,此 API 接收用户位置信息的频率会高于非批处理 API。但请注意,您的应用仍以每小时几次的频率批量接收更新。
受影响的 API
对后台应用中位置信息检索行为的更改会影响以下 API:
- 一体化位置信息提供程序 (FLP)
-
-
如果您的应用在后台运行,位置系统服务只会每小时只计算几次新位置。即使您的应用请求更频繁地请求位置信息更新,也是如此。
不过,通过使用 批量版本的 FLP,您可以在应用收到批量更新(每小时仅发生几次)后,访问更多时间频繁的位置记录。
- 如果应用在前台运行,则与 Android 7.1.1(API 级别 25)相比,位置信息采样率没有变化。
-
- 地理围栏
-
- 与来自一体化位置信息提供程序的更新相比,后台应用可以更频繁地接收地理围栏 transition 事件。
- 地理围栏事件的平均响应时间是每隔几分钟左右发生一次。
- GNSS Measurements 和 GNSS Navigation Messages
-
- 当您的应用位于后台时,已注册为接收
GnssMeasurement
和GnssNavigationMessage
输出的回调会停止执行。
- 当您的应用位于后台时,已注册为接收
- Location Manager
-
-
位置信息更新每小时仅向后台应用提供几次。
注意:如果您的应用在安装了 Google Play 服务的设备上运行,强烈建议您改用一体化位置信息提供程序 (FLP)。
-
- Wi-Fi Manager
-
startScan()
方法对后台应用执行完整扫描的频率仅为每小时几次。如果不久之后后台应用再次调用此方法,WifiManager
类会提供上次扫描的缓存结果。