本部分将介绍一些典型的位置信息收集场景,以及 Geofencing API 和 Fused Location Provider API 的最佳用法建议。
用户可见或前台更新
示例:需要频繁的准确更新且延迟极短的地图应用。所有更新都发生在前台:用户启动某个 Activity,使用位置数据,然后在短时间内停止该 Activity。
使用 setPriority()
方法,值为 PRIORITY_HIGH_ACCURACY
或 PRIORITY_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_ACCURACY
或 PRIORITY_LOW_POWER
,但应避免将 PRIORITY_HIGH_ACCURACY
用于持续的后台工作,因为此选项会消耗大量电池电量。
如果您需要更多位置数据,请使用被动定位:调用 setFastestInterval()
方法,传递一个比传递给 setInterval()
的值更小的值。当与 PRIORITY_NO_POWER
选项结合使用时,被动定位可适时地传递其他应用计算出的位置,不会产生任何额外的消耗。
使用 setMaxWaitTime()
方法,增加一些延迟时间来调节频率。例如,如果您使用 setinterval()
方法以及一个大约 10 分钟的值,则应考虑调用 setMaxWaitTime()
并传递一个 30 至 60 分钟之间的值。通过使用上述选项,您的应用将每 10 分钟左右计算一次位置,但它每 30 至 60 分钟才会被唤醒一次,对一些位置数据进行批量更新。此方法通过牺牲延迟时间来获得更多的可用数据和更好的电池性能。
在用户与其他应用互动时频繁进行高精度更新
示例:在用户关闭屏幕或打开其他应用时继续工作的导航或健身应用。
使用前台服务。如果您的应用可能要为用户完成一些消耗极大的工作,建议最好让用户知晓这些工作。前台服务需要持久性通知。如需了解详情,请参阅通知概览。