为降低耗电量,Android 8.0(API 级别 26)会对后台应用检索用户当前位置信息的频率进行限制。应用每小时仅接收几次位置信息更新。
注意:无论应用的目标 SDK 版本为何,这些限制适用于在搭载 Android 8.0(API 级别 26)或更高版本的设备上使用的所有应用。
如果您的应用在后台运行时依赖实时提醒或运动检测,这一位置检索行为就显得特别重要,必须紧记。
系统会对前台应用和后台应用进行区分。应用满足以下任一条件即视为前台应用:
- 它具有可见的 Activity,无论 Activity 处于启动还是暂停状态。
- 它具有前台服务。
- 另一个前台应用已关联到该应用(不管是通过绑定到其中一个服务,还是通过使用其中一个内容提供程序)。例如,如果应用中的以下任意组件已与另一个前台应用绑定,则该应用将被视为前台应用:
- 输入法 (IME)
- 壁纸服务
- 通知侦听器
- 语音或文本服务
如果以上所有条件均不满足,应用即视为后台应用。
前台应用行为得到保留
如果应用在搭载 Android 8.0(API 级别 26)的设备的前台运行,则其位置信息更新行为与 Android 7.1.1(API 级别 25)或更低版本相同。
警告:如果您的应用长时间进行近乎实时的位置信息更新检索,则设备的电池续航时间将大幅度缩短。
优化应用的位置行为
考虑这样一个问题:如果您的应用接收位置信息更新的频率较低,其后台运行用例是否完全没法成功。如果属于这种情况,您可以通过执行下列操作之一提高位置信息更新的检索频率:
- 将您的应用转至前台。
- 调用
startForegroundService()
以启动应用中的某个前台服务。此前台服务处于活动状态后,会以通知的形式持续显示在通知区域。 - 使用 Geofencing API 的元素(例如
GeofencingClient
),这些元素经过了优化,可以最大限度减少耗电量。 - 使用被动位置侦听器,在前台应用以更高的频率请求位置信息更新时,这样可以提高位置信息更新的接收频率。
注意:如果您的应用需要访问的位置记录包含时间频繁更新,请使用批处理版本的 Fused Location Provider API 元素,例如 FusedLocationProviderApi
接口。当您的应用在后台运行时,此 API 会以高于非批处理版本 API 的频率接收用户的位置信息。但切记,您的应用仍按每小时几次的频率批量接收更新。
受影响的 API
对后台应用位置检索行为的更改影响下列 API:
- Fused Location Provider (FLP)
-
-
如果您的应用在后台运行,位置系统服务只会按每小时几次的频率为其计算新位置。即使您的应用请求进行更频繁的位置信息更新,也仍是如此。
但通过使用批处理版本的 FLP,您能够在应用收到批量更新(频率仍为每小时几次)后访问更多时间频繁位置记录。
- 如果您的应用在前台运行,则其位置信息采样频率与 Android 7.1.1(API 级别 25)相同。
-
- Geofencing
-
- 后台应用接收地理围栏转换事件的频率高于接收 Fused Location Provider 更新的频率。
- 地理围栏事件的平均响应频率是大约每两分钟一次。
- GNSS Measurements 和 GNSS Navigation Messages
-
- 当您的应用位于后台时,注册用于接收
GnssMeasurement
和GnssNavigationMessage
输出的回调会停止执行。
- 当您的应用位于后台时,注册用于接收
- Location Manager
-
-
位置信息更新仅按每小时几次的频率提供给后台应用。
注意:如果运行您的应用的设备安装了 Google Play 服务,强烈建议您改用 Fused Location Provider (FLP)。
-
- WLAN Manager
startScan()
方法对后台应用执行完整扫描的频率仅为每小时几次。如果不久之后后台应用再次调用此方法,WifiManager
类将提供上次扫描所缓存的结果。