采取以下措施,在使用位置服务时,减少应用对设备电池续航的影响。
移除位置信息更新
不必要地耗尽电池电量的常见原因是在不再需要位置信息更新时未能将其移除。
当某个 Activity 的 onStart()
或 onResume()
生命周期方法包含对 requestlocationUpdates()
的调用,但在 onPause()
或 onStop()
生命周期方法中没有相应的对 removeLocationUpdates()
的调用时,就可能发生这种情况。
您可以使用支持生命周期的组件来更好地管理应用中 Activity 的生命周期。如需了解详情,请参阅使用支持生命周期的组件处理生命周期。
设置超时
为防止电池电量耗尽,请在位置信息更新应停止时设置合理的超时。超时设置可确保更新不会无限期持续,并在请求更新但未移除更新的场景中(例如,因为代码中的 bug)保护应用。
对于融合位置信息提供程序请求,通过调用 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();
在此情况下,系统会大约每十分钟计算一次位置信息,并大约每小时批量发送约六个位置信息数据点。虽然您仍然大约每十分钟获得一次位置信息更新,但您的设备大约每小时才唤醒一次,因此可以节省电量。
使用被动位置信息更新
在后台用例中,限制位置信息更新是一个好主意。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()
中指定的间隔不应太小。