【发布时间】: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