Google (Play) 睡眠模式下的位置服务更新间隔更改 (Android)
Posted
技术标签:
【中文标题】Google (Play) 睡眠模式下的位置服务更新间隔更改 (Android)【英文标题】:Google (Play) Location Services Update Interval Changes in Sleep Mode (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 服务通常会在其工作完成后自行终止,但是我想让服务保持活动状态,直到它被关闭,因此使用绑定服务。它工作得很好,我要解决的问题是更新间隔根据运行应用程序的手机的“模式”(插入与否,睡眠模式与否)而变化。感谢您的帮助。
【参考方案1】:
根据setInterval() documentation:
这个间隔是不准确的。您可能根本不会收到更新(如果没有可用的位置资源),或者您收到更新的速度可能比请求的慢。
无法保证setInterval()
的时间与您设置的时间间隔一致。您只能假设由于您没有收到任何新位置,因此设备没有改变位置。
在任何情况下,获取位置请求的时间都不取决于您的应用程序中的任何状态(无论您是否使用绑定服务),并且完全由 Google Play 服务应用程序管理。
【讨论】:
我忘了我读过一次...我刚刚得到如此一致的位置更新*(设置为 30000 毫秒时每 25-40 秒),我忘记了它不能保证。 *我可以肯定地说,无论设备位置如何,当使用 BALANCED_POWER 模式时,仅当设备处于待机/睡眠状态时,间隔(在我对 2 个不同设备上的测试中)变得不一致(看似随机间隔长达 5 分钟)(无论如何按下电源按钮时的模式)。 您是否对演示该问题的我的应用程序的快速版本感兴趣?以上是关于Google (Play) 睡眠模式下的位置服务更新间隔更改 (Android)的主要内容,如果未能解决你的问题,请参考以下文章
Google Play 的定位服务在“仅限设备”模式下不起作用