针对实际场景优化位置信息使用

本部分将介绍一些典型的位置信息收集场景,以及 Geofencing API 和 Fused Location Provider API 的最佳用法建议。

用户可见或前台更新

示例:需要频繁的准确更新且延迟极短的地图应用。所有更新都发生在前台:用户启动某个 Activity,使用位置数据,然后在短时间内停止该 Activity。

使用 setPriority() 方法,值为 PRIORITY_HIGH_ACCURACYPRIORITY_BALANCED_POWER_ACCURACY

setInterval() 方法中指定的时间间隔取决于具体用例:在实时用例中,应将该值设置为几秒;在其他用例中,将该值限制为几分钟(建议设置为大约两分钟或更久,以尽量减少电池用量)。

获知设备的位置信息

示例:天气应用想获知设备的位置。

使用 getLastLocation() 方法,该方法将会返回最近的可用位置信息(在极少数情况下可能为 null)。此方法提供了一种获取位置信息的简单方法,并且不会产生主动请求位置信息更新的相关费用。结合使用 isLocationAvailable() 方法,该方法在 getLastLocation() 返回的位置信息合理更新时返回 true

在用户位于特定位置时启动更新

示例:在用户距公司、家或其他位置一定范围内时请求更新。

结合使用地理围栏更新和一体化位置信息提供程序更新。在应用收到地理围栏进入触发器时请求更新,并且在应用收到地理围栏离开触发器时移除更新。这可确保只有在用户进入到定义区域时,应用才会获得更��细的位置信息更新。

此场景的典型工作流包括:在发生地理围栏进入 transition 事件时显示通知,以及在用户点按该通知时启动包含请求更新的代码的 Activity。

基于用户的 activity 状态启动更新

示例:仅在用户开车或骑自行车时请求更新。

结合使用 Activity Recognition API 更新和一体化位置信息提供程序更新。在检测到目标 activity 时请求更新,并且在用户停止执行该 activity 时移除更新。

此用例的典型工作流包括:在检测到目标 activity 时显示通知,以及在用户点按该通知时启动包含请求更新的代码的 activity。

长期运行的后台位置信息更新与地理区域绑定

示例:用户想在设备附近有零售商时获得通知。

这是一个很好的地理围栏用例。此用例几乎肯定会涉及后台位置信息服务,因此应使用 addGeofences(GeofencingRequest, PendingIntent) 方法。

您应设置以下配置选项:

  • 如果您在跟踪停留 transition 事件,应使用 setLoiteringDelay() 方法,传递一个大约五分钟或更小的值。

  • 使用 setNotificationResponsiveness(),传递一个大约五分钟的值。但是,如果您的应用能够达到更久的响应延迟,则可考虑传递一个大约 10 分钟的值。

一个应用一次最多只能注册 100 个地理围栏。如果在一个用例中,应用希望跟踪较多的零售商选项,那么该应用可能需要注册更多地理围栏(城市级),并为大型地理围栏内的商店动态注册较小的地理围栏(城市内的地点)。当用户进入大型地理围栏时,��加较小的地理围栏;当用户离开大型地理围栏时,移除较小的地理围栏��并为新区域重新注册地理围栏。

长期运行的后台位置信息更新(无可见应用组件)

示例:被动追踪位置的应用

尽可能使用 setPriority() 方法以及 PRIORITY_NO_POWER 选项,因为它几乎不会消耗电池电量。如果无法使用 PRIORITY_NO_POWER,请使用 PRIORITY_BALANCED_POWER_ACCURACYPRIORITY_LOW_POWER,但应避免将 PRIORITY_HIGH_ACCURACY 用于持续的后台工作,因为此选项会消耗大量电池电量。

如果您需要更多位置数据,请使用被动定位:调用 setFastestInterval() 方法,传递一个比传递给 setInterval() 的值更小的值。当与 PRIORITY_NO_POWER 选项结合使用时,被动定位可适时地传递其他应用计算出的位置,不会产生任何额外的消耗。

使用 setMaxWaitTime() 方法,增加一些延迟时间来调节频率。例如,如果您使用 setinterval() 方法以及一个大约 10 分钟的值,则应考虑调用 setMaxWaitTime() 并传递一个 30 至 60 分钟之间的值。通过使用上述选项,您的应用将每 10 分钟左右计算一次位置,但它每 30 至 60 分钟才会被唤醒一次,对一些位置数据进行批量更新。此方法通过牺牲延迟时间来获得更多的可用数据和更好的电池性能。

在用户与其他应用互动时频繁进行高精度更新

示例:在用户关闭屏幕或打开其他应用时继续工作的导航或健身应用。

使用前台服务。如果您的应用可能要为用户完成一些消耗极大的工作,建议最好让用户知晓这些工作。前台服务需要持久性通知。如需了解详情,请参阅通知概览