【问题标题】:Google (Play) Location Services Update Interval Changes in Sleep Mode (Android)Google (Play) 睡眠模式下的位置服务更新间隔更改 (Android)
【发布时间】:2016-12-16 04:29:57
【问题描述】:

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

这是通过一个类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 模式,以及为什么间隔会受到睡眠的影响(?)运行应用程序的手机模式?我认为 google play 服务会自动使用唤醒锁,所以我们不必担心这些东西。

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

更新:我已经使用 Galaxy S4 进行了测试,它似乎也忽略/更改了我声明的所需更新间隔,只有在拔掉电源并按下电源按钮进入睡眠状态时。在这款手机的情况下,它似乎平均间隔 1.5 分钟,最长 5 分钟......直到它退出睡眠模式并回到我在代码中设置的 30 秒(大约)。

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

【问题讨论】:

  • 您的服务绑定到什么?我不认为 bound service 意味着你认为它的意思。
  • 它工作正常(除了所述的问题)7 个月。我对绑定服务的理解如下:developer.android.com/guide/components/bound-services.html
  • 如果您的应用程序中实际上没有使用您的服务调用bindService,那么该代码根本不会执行任何操作。当然,Google Play 服务的位置不需要绑定服务(假设您使用的是PendingIntent 版本,无论您的服务是否存在,它都会启动您的应用并提供结果)。
  • (注意:我很确定我是否使用最好的实现的问题与手头的问题无关。我相对较新,不知道最好的可能的方式...但到目前为止这种方式有效)... bindService 是从我的 MainActivity 调用的。 MainActivity 中的切换按钮启动/停止位置服务。 [继续]
  • 我选择 Intentservice 是因为我希望它位于 seaparet 线程上……因为它确实在 onLocationChanged() 内部工作。据我了解,Intent 服务通常会在其工作完成后自行终止,但是我想让服务保持活动状态,直到它被关闭,因此使用绑定服务。它工作得很好,我要解决的问题是更新间隔根据运行应用程序的手机的“模式”(插入与否,睡眠模式与否)而变化。感谢您的帮助。

标签: android service location sleep intervals


【解决方案1】:

根据setInterval() documentation

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

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

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

【讨论】:

  • 我忘了我读过一次...我刚刚得到如此一致的位置更新*(设置为 30000 毫秒时每 25-40 秒),我忘记了它不能保证。 *我可以肯定地说,无论设备位置如何,当使用 BALANCED_POWER 模式时,仅当设备处于待机/睡眠状态时,间隔(在我对 2 个不同设备上的测试中)变得不一致(看似随机间隔长达 5 分钟)(无论如何按下电源按钮时的模式)。
  • 您是否对演示该问题的我的应用程序的快速版本感兴趣?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
  • 2018-02-08
  • 2014-07-25
  • 2018-01-06
相关资源
最近更新 更多