5

我正在开发一个由服务和活动组成的应用程序。该服务使用 LocationClient 对象每分钟请求一次当前位置。该活动使用另一个 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);

在活动中:

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 吗?

4

1 回答 1

1

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

其次 - 我认为您可以在单个应用程序中拥有多少个位置客户端没有限制,但是,我认为您错过了这些客户端如何与 Google Play 服务交互以接收更新。查看文档可以提供一些见解。

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

调用 LocationRequest.setFastestInterval() 也有助于节省电量。当您通过调用 LocationRequest.setInterval() 请求首选更新速率,并通过调用 LocationRequest.setFastestInterval() 请求最大速率时,您的应用程序将获得与系统中最快速率相同的更新速率。如果其他应用程序要求更快的速度,您将受益于更快的速度。如果没有其他应用程序有更快的速率请求未完成,您的应用程序会以您使用 LocationRequest.setInterval() 指定的速率接收更新。

当您收到更新时不会直接链接到您请求它的时间。有时会更快,有时会更晚。间隔只是一种偏好。

于 2014-01-23T19:13:23.773 回答