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

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

移除位置信息更新

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

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

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

设置超时

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

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

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

批处理请求

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

Kotlin

val request = LocationRequest()
request.setInterval(10 * 60 * 1000)
request.setMaxWaitTime(60 * 60 * 1000)

Java

LocationRequest request = new LocationRequest();
request.setInterval(10 * 60 * 1000);
request.setMaxWaitTime(60 * 60 * 1000);

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

使用被动位置信息更新

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

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

Kotlin

val request = LocationRequest()
request.setInterval(15 * 60 * 1000)
request.setFastestInterval(2 * 60 * 1000)

Java

LocationRequest request = new LocationRequest();
request.setInterval(15 * 60 * 1000);
request.setFastestInterval(2 * 60 * 1000);

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

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