我有一个应用程序,定期将用户的位置上传到服务器。
这是通过一个类LocationService来完成的,它是一个绑定的 IntentService。原因是它需要继续可靠地报告位置,即使最小化。
在MainActivity中,用户点击切换按钮以指示他们想要开始报告其位置(或切换为停止它)。此按钮用于触发位置服务的启动和绑定(或停止/终止)。位置服务使用Google Play定位服务...以下是一些代码:
public class MyLocationService
extends IntentService
implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener
{
private final IBinder myBinder = new MyLocalBinder();
protected static final String TAG = "DXX MyLocationService";
protected GoogleApiClient mGoogleApiClient;
protected LocationRequest mLocationRequest;
protected Location mCurrentLocation;
public static final long UPDATE_INTERVAL_IN_MILLISECONDS = 30000L;
public static final long FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS = 15000L;
public IBinder onBind(Intent arg0)
{
Log.i(TAG, "ONBIND WAS RUN!!");
return this.myBinder;
}
public class MyLocalBinder
extends Binder
{
public MyLocalBinder() {}
MyLocationService getService()
{
return MyLocationService.this;
}
}
protected void createLocationRequest()
{
Log.i(TAG, "createLocationRequest() was run");
this.mLocationRequest = new LocationRequest();
this.mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
this.mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
// TODO find out what this means
this.mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
}
如您所见,我将优先级设置为BALANCED_POWER_ACCURACY,并将更新间隔设置为30秒。
所以...一切似乎都运转良好,但似乎在至少一个案例中,用户正在使用HTC ...当他们的手机处于睡眠模式时(我假设它被称为睡眠模式) ......我的意思是基本上任何时候屏幕自身都变黑了,手机的更新从30秒间隔变为5分钟间隔。 (我可以从服务器端看到这一点。)
我对这个明显的事实感到困扰,即明确定义的间隔是任意(?)忽略的。我需要有一个可靠的间隔,以便服务器确定是否有人可用。
我会对其他手机进行更多测试,但与此同时,有没有人有这方面的经验 - 谷歌在绑定的意向服务中使用BALANCED POWER模式播放位置服务,以及为什么间隔会受到睡眠的影响(?)应用程序正在运行的手机模式?我认为谷歌播放服务会自动使用唤醒锁,因此我们不应该担心这些问题。
感谢您的帮助,我会更新任何调查结果。
更新:我已经测试过使用了一个星系S4,它似乎也忽略/改变我所说的所需更新间隔,只有在拔掉插头时,按下电源按钮才能进入睡眠状态。在这款手机的情况下,它似乎平均间隔1.5分钟,最多5分钟...直到它退出睡眠模式并且它回到30秒(大约)我在代码中设置。
更新2:我尝试使用mLocationRequest.setMaxWaitTime(31000),但这似乎没有任何效果。
答案 0 :(得分:1)
根据setInterval() documentation:
此间隔不准确。您可能根本没有收到更新(如果没有可用的位置源),或者您收到的速度比请求的速度慢。
无法保证setInterval()
时间与您设定的时间间隔一致。您只能假设由于您没有收到任何新位置,因此设备没有改变位置。
在任何情况下,获取位置请求的时间并不取决于您的应用程序中的任何状态(无论您是否使用绑定服务),并且完全由Google Play服务应用程序管理。