Google(播放)睡眠模式下位置服务更新间隔变化(Android)

Google (Play) Location Services Update Interval Changes in Sleep Mode (Android)

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

这是通过 class、LocationService 完成的,它是一个 bound IntentService。原因是即使最小化,它也需要继续可靠地报告位置。

在 MainActivity 中,用户单击切换按钮以指示他们想要开始报告其位置(或关闭以停止报告)。此按钮触发定位服务启动和绑定(或 stopped/killed)。定位服务使用 Google Play Location Services...这里有一些代码:

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 手机...当他们的 phone 处于睡眠模式时(我假设它被称为睡眠模式……我的意思是基本上任何时候屏幕都会自行变暗),phone 的更新从 30 秒间隔变为 5 分钟间隔。 (我可以从服务器端看到这个)。

我对显式定义的区间被任意(?)忽略这一明显事实感到困扰。我需要有一个可靠的时间间隔,以便服务器确定某人是否活跃。

我将对其他 phone 进行更多测试,但与此同时,有没有人对此有任何经验 -- Google 使用 BALANCED POWER 模式在绑定的 intentservice 中播放位置服务,以及为什么间隔会受到应用 运行 开启的 phone 的睡眠 (?) 模式的影响?我认为 google 播放服务会自动使用唤醒锁,因此我们不必担心这些问题。

感谢您的帮助,我会更新任何发现。

更新:我已经使用 galaxy S4 进行了测试,它似乎也 ignore/alter 我声明的期望更新间隔只有在拔下电源并按下电源按钮进入睡眠状态时才会如此。在这个 phone 的情况下,它似乎平均间隔 1.5 分钟,最多 5 分钟......直到它从睡眠模式中恢复并且回到我设定的 30 秒(大约)在代码中设置。

更新 2:我尝试使用 mLocationRequest.setMaxWaitTime(31000),但这似乎没有任何效果。

根据 setInterval() documentation:

This interval is inexact. You may not receive updates at all (if no location sources are available), or you may receive them slower than requested.

不保证setInterval()时间与您设置的时间间隔一致。你只能假设因为你没有收到任何新的位置,设备没有改变位置。

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