优化位置信息使用情况以延长电池续航时间

请采取以下措施,以减少应用对设备电池续航时间的影响,在使用位置信息服务时。

移除位置信息更新

造成不必要的电池电量消耗的一个常见原因是,当不再需要位置信息更新时,没有移除它们。

例如,当某个 activity 的 onStart()onResume() 生命周期方法中包含 requestlocationUpdates() 调用,但在 onPause()onStop() 生命周期方法中却没有相应的 removeLocationUpdates() 调用时,就会发生这种情况。

您可使用生命周期感知型组件更好地管理应用中的 Activity 的生命周期。如需了解详情,请参阅使用生命周期感知型组件处理生命周期

设置超时

为了防止电池电量消耗,应设置一个停止位置信息更新的合理超时。通过设置超时,可确保更新不会无限期地继续,并在请求更新后未移除更新的情况下(例如由于代码错误),对应用起到保护作用。

对于一体化位置信息提供程序请求,可通过调用 setDurationMillis()(将接收一个表示自该方法上一次被调用后的时长 [以毫秒计] 的参数)添加超时。您还可以使用此方法以时长来表示到期时间。

如需为地理围栏位置信息请求添加超时,请调用 setExpirationDuration() 方法。

批处理请求

对于所有非前台用例,将多个请求一起进行批处理。使用 setIntervalMillis() 方法指定计算位置的时间间隔。然后,使用 setMaxUpdateDelayMillis() 方法设置将位置信息传递给应用的时间间隔。向 setMaxUpdateDelayMillis() 方法传递的值应是传递给 setIntervalMillis() 方法的值的倍数。例如,请考虑以下位置请求:

Kotlin

val request = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10 * 60 * 1000)
.setMaxUpdateDelayMillis(60 * 60 * 1000)
.build()

Java

LocationRequest request = new LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10 * 60 * 1000)
    .setMaxUpdateDelayMillis(60 * 60 * 1000)
    .build();

在这种情况下,系统大约每 10 分钟计算一次位置,并且大约每小时批量传递六个左右位置数据点。虽然您仍然每十分钟左右就会获得位置信息更新,但您节省了电池用量,因为您的设备大约每小时才会被唤醒一次。

使用被动位置信息更新

在后台用例中,限制位置信息更新是一个好方法。Android 8.0(API 级别 26)中的后台位置信息限制将强制执行此做法,但在较低版本设备上运行的应用也应尽量限制后台位置信息更新。

可能当您的应用在后台运行时,另一个应用会频繁地在前台请求位置信息更新。位置信息服务会向您的应用提供这些更新。请考虑以下位置信息请求,它会适时地使用位置数据:

Kotlin

val request = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 15 * 60 * 1000)
.setMinUpdateIntervalMillis(2 * 60 * 1000)
.build()

Java

LocationRequest request = new LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 15 * 60 * 1000)
    .setMinUpdateIntervalMillis(2 * 60 * 1000)
    .build();

在上一个例子中,应用的位置大约每 15 分钟计算一次。如果其他应用请求位置信息,该应用可在最多两分钟后获得这些信息。

虽然被动地使用位置信息不会导致电池电量消耗,但当接收位置数据会触发昂贵的 CPU 或 I/O 操作时,应格外小心。为了最大限度地降低电池电量消耗,setMinUpdateIntervalMillis() 中指定的时间间隔不应过小。