我正在开发一个包含服务和 Activity 的应用程序。该服务使用LocationClient对象每分钟请求当前位置。该 Activity 使用另一个LocationClient对象,以在单击按钮后请求单个当前位置

在服务中:

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);

在 Activity 中:
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);

仅此一项服务就可以像预期的那样工作。

但是,如果启动了服务,并且 Activity 尝试获取单个当前位置,则它将接收该位置,直到服务接收到更新的位置为止。因此,该 Activity 最多需要等待60秒。

但是,如果服务是而未启动,并且 Activity 尝试获取单个当前位置,则它将在短时间内收到预期的位置(通常
是什么原因引起的?每个应用程序仅允许一个LocationListener吗?

最佳答案

首先-如果您需要即时位置,则无需请求位置更新,只需在位置客户端上调用getLastLocation()。如果LocationClient有一个可用的位置,则将为您提供最佳/最新的定位结果。如果没有,那么我将请求更新。

其次-我认为一个应用程序中可以容纳多少个位置客户端没有限制,但是,我想您正在丢失这些客户端与Google Play服务进行交互以接收更新的方式。查看docs提供了一些见识。

如果向下滚动到有关指定更新参数的部分,您将看到LocationClient位于您和要查找的位置数据之间。手机上实现LocationClient的所有其他应用都试图访问相同的数据。 LocationClient尝试在您请求的时间间隔内满足您的请求。但是,由于其他使用LocationClient的应用可能正在尝试访问相同的数据,因此无法保证时间。最好的例子是setFastestInterval():



当您收到更新时,它与您请求时没有直接链接。有时会早一些,有时会晚些。间隔仅仅是一个首选项。

10-07 20:41