我正在开发一个由服务和活动组成的应用程序。该服务使用LocationClient-object来请求当前位置每分钟。单击按钮后,活动使用另一个LocationClient-object请求单个当前位置。
在服务中:
mLocationRequest = LocationRequest.create();
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setInterval(60000);
mLocationRequest.setFastestInterval(60000);
mLocationClient = new LocationClient(this, this, this);
// ... when connected:
mLocationClient.requestLocationUpdates(mLocationRequest, this);
在活动中:
mLocationRequest = LocationRequest.create();
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setInterval(0); // 0 should be ok since only a single location is requested
mLocationRequest.setFastestInterval(0);
mLocationRequest.setNumUpdates(1); // get only a single location
mLocationClient = new LocationClient(this, this, this);
// ... when connected:
mLocationClient.requestLocationUpdates(mLocationRequest, this);
仅服务就像预期的那样。
但是,如果服务已启动并且活动尝试获取单个当前位置,则它会在服务收到更新的位置之前收到该位置。所以活动必须等待60秒。
但是,如果服务未启动且活动尝试获取单个当前位置,则它会在预期的短时间后(通常<5秒)收到该位置。
导致问题的原因是什么?每个应用只允许一个LocationListener吗?
答案 0 :(得分:1)
首先 - 如果您需要立即位置,请不要请求位置更新,只需在您的位置客户端上调用getLastLocation()即可。如果LocationClient
有一个可用的,那么这将为您提供最佳/最新的位置结果。如果没有,那么我会要求更新。
第二 - 我认为单个应用中您可以拥有多少位置客户端是有限制的,但是,我认为您错过了这些客户与Google Play服务进行交互以接收更新的方式。查看docs提供了一些见解。
如果向下滚动到有关指定更新参数的部分,您会看到LocationClient
位于您和您寻找的位置数据之间。实施LocationClient
的电话上的所有其他应用都会尝试访问相同的数据。 LocationClient
尝试在您要求的时间间隔内填写您的请求。但是,由于使用LocationClient
的其他应用可能尝试访问相同的数据,因此无法保证时间安排。最好的例子是setFastestInterval():
调用LocationRequest.setFastestInterval()也有助于节省电量。 通过呼叫请求首选更新速率时 LocationRequest.setInterval(),并通过调用最大速率 LocationRequest.setFastestInterval(),然后你的应用程序获得相同 更新速率是系统中最快的速率。如果有其他应用程序 要求更快的速度,您可以获得更快的速度。如果不 其他应用有更快的费率请求,您的应用收到 使用LocationRequest.setInterval()指定的速率更新。
当您收到更新时,并未直接链接到您的请求时。有时它会更快,有时会更晚。间隔仅仅是一种偏好。