Google(Play)位置服务更新睡眠模式下的间隔更改(Android)

时间:2016-08-10 00:21:39

标签: android service location sleep intervals

我有一个应用程序,定期将用户的位置上传到服务器。

这是通过一个类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),但这似乎没有任何效果。

1 个答案:

答案 0 :(得分:1)

根据setInterval() documentation

  

此间隔不准确。您可能根本没有收到更新(如果没有可用的位置源),或者您收到的速度比请求的速度慢。

无法保证setInterval()时间与您设定的时间间隔一致。您只能假设由于您没有收到任何新位置,因此设备没有改变位置。

在任何情况下,获取位置请求的时间并不取决于您的应用程序中的任何状态(无论您是否使用绑定服务),并且完全由Google Play服务应用程序管理。