之前在开发Android程序调用GPS时,都是直接用函数
public void requestLocationUpdates (long minTime, float minDistance, Criteria criteria, PendingIntent intent)
但是最近客户说手机的GPS不够精确,所以特意从google developer官网了解了一下这个函数签名中的两个参数,翻译如下(如有不准确欢迎纠正):
- minTime:应用程序接收GPS更新的最短时间(即只有超过这个时间设定,系统才可能通知我们的程序说“GPS"——单位毫秒
- minDistance:应用程序接收GPS更新的最短距离(即只有超过这个距离,系统才可能通知我们的程序来更新GPS数据)——单位米
翻译:
注册定位更新服务(可指定不同的定位类型和回调事件)
当前的activity通过requestLocationUpdates() 或requestSingleUpdate()
注册,根据provider、或者根据符合特定条件的 Criteria
周期性地更新定位和状态。
第一次定位可能会花费一定的时间(一般在30~60秒左右,依不同设备而定)。如果要立即获取定位数据,建议使用getLastKnownLocation(String)
方法(获取最后一次定位记录的数据,所以可能是很旧的数据)。
定位数据更新时,会执行 回调函数LocationListener,或者一个intent广播。
如果调用者提供了一个intent, 那么定位数据的更新会发送一个KEY_LOCATION_CHANGED
和 一个Location
对象(通过这两个对象可以获取最新的定位数据)。
定位更新的间隔可以通过minTime参数来控制。两次定位更新所间隔的时间必然大于minTime,然而它更受到定位类型和其它注册应用设置的间隔时间的影响。
设置一个合理的minTime值对于提高电池的使用时间及其重要。任何的GPS、WIFI、Cell和其他的无线通讯的更新都消耗电量。在用户可接受的程度范围内,尽可能得将minTime设置的越大越好。如果你的应用不在前台运行,并且只给用户显示定位数据,那么你的应用可以使用主动 provider(如 NETWORK_PROVIDER
或 GPS_PROVIDER
),但是如果你非用不可,那么尽可能悬着minTime=5*60*1000(5分钟)或者更长。如果你的应用运行在前台并且给用户实时显示,那么可以选择一个更短的间隔。
minDistance也可以控制定位更新的频率。如果该值大于0,那么定位服务只会在距离变更超过minDistance米时才会通知你的应用,而且至少经过minTime毫秒之后。但是minDistance相对而言更加费电,因此minTime还是省点的首选参数。
如果你的应用只是被动得通过其它应用通知定位数据的更新,而不消耗任何其它的电量,那么可以采用PASSIVE_PROVIDER。该模式不会主动打开或者修改定位服务,因此你不需要对minTime和minDistance的值特别谨慎。如果你的应用对定位数据(如网络定位数据)更新要求特别高,并且有另一个应用程序注册开启了极其快速的定位数据更新,那么你应该为minTime和minDistance一个非0的值,以此来限制你自己应用更新的频率。
当用户关闭了某种定位类型(假设A),那么该类型定位的数据更新将被迫停止,然而一个可用的定位类型将被采用(假设B)。一旦该服务(A)又被开启,定位数据更新将立即被唤起。各种定位类型能在任何时间发送更新状态,或者仅仅指定某中类型的状态变化。如果回调函数被设置,那么可通过过 onProviderDisabled(String)
,onProviderEnabled(String)
或者 onStatusChanged(String, int, Bundle)
这三个函数来获取状态。同理,如果一个intent被设置,那么装好和可用的更新将会被广播( KEY_PROVIDER_ENABLED
or KEY_STATUS_CHANGED
)。
如果一个没有特定的消息(Looper)的
LocationListener
被设置,那么当前调用的线程必须是一个拥有消息(Looper
)的线程比如说应用的主线程。 If a Looper is specified with a LocationListener
then callbacks are made on the supplied Looper thread.(实在懂不了。。。)