如果我打开应用程序几个小时,融合位置会停止发送更新...
我正在创建具有高优先级的位置请求,这里是代码:
<!doctype html>
<html ng-app="App">
<head>
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.9/angular.min.js"></script>
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.9/angular-animate.min.js"></script>
</head>
<body ng-controller="HomeController">
<div class="out" ng-if="data.show" ng-animate-children>
<div class="inA" ng-if="data.show2">
HELLO
</div>
<div class="inB" ng-if="!data.show2">
GOODBYE
</div>
</div>
<div ng-click="toggle()">toggle</div>
</body>
</html>
这是客户端和回调:
LocationRequest = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setExpirationDuration(TimeUnit.SECONDS.toMillis(LOCATION_TIMEOUT_IN_SECONDS))
.setInterval(LOCATION_UPDATE_INTERVAL);
LOCATION_TIMEOUT_IN_SECONDS是5秒,但更新并不总是在运行,我停止并手动启动它,当我的应用程序需要位置时。就像是documented。
如果应用程序运行一两个小时,一切正常,但如果我将其打开很长时间,它就会停止工作......
我请求按钮点击活动的位置更新,10秒后,我手动停止位置更新...如果我整夜离开,这意味着活动整晚都活着...此后,当我请求位置时再次更新,它没有来......
任何解决方案或想法?
答案 0 :(得分:2)
setExpirationDuration(long millis)
来自docs:
设置此请求的持续时间,以毫秒为单位。
持续时间立即开始(而不是在请求传递给位置客户端时),因此如果请求稍后重新使用,请再次调用此方法。
位置客户端将在请求到期后自动停止更新。
持续时间包括暂停时间。允许使用小于0的值,但表示请求已过期。
如果您想永久接收位置更新,请将其删除或设置适当的时间。
答案 1 :(得分:0)
这是MyApplication类:
public class MyApplication extends Application {
public static boolean isActivityVisible() {
return activityVisible;
}
public static void setVisibilityTrue() {
activityVisible = true;
}
这是我的baseActivity类:
public static void activityResumed() {
boolean isScreenOn = true;
// isScreenOn() method is deprecated API level 21. You should use
isInteractive instead:
PowerManager pm = (PowerManager)
MyApplication.getInstance().getSystemService(Context.POWER_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
isScreenOn = pm.isInteractive();
} else {
isScreenOn = pm.isScreenOn();
}
if (isScreenOn) {
activityVisible = true;
}
}
public static void activityPaused() {
boolean isScreenOn = true;
PowerManager pm = (PowerManager)
MyApplication.getInstance().getSystemService(Context.POWER_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
isScreenOn = pm.isInteractive();
} else {
isScreenOn = pm.isScreenOn();
}
if (isScreenOn) {
activityVisible = false;
}
}
private static boolean activityVisible;
}
当应用程序在后台时,我们将其带到前台,每隔30秒我们会检查应用程序屏幕是否已锁定,如果已锁定我们打开应用程序:private void bringApplicationToFront(Context context) {
/**
* check if motitor screen is Off/On
* */
boolean isScreenOn = true;
PowerManager pm = (PowerManager)
getSystemService(Context.POWER_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
isScreenOn = pm.isInteractive();
} else {
isScreenOn = pm.isScreenOn();
}
if (!isScreenOn) {
/**
* check if app is fore/back ground
* */
boolean isInForeBackground = false;
try {
isInForeBackground = MyApplication.isActivityVisible();
} catch (Exception e) {
e.printStackTrace();
}
if (!isInForeBackground) {
Intent notificationIntent = new Intent(context,
ActivitySplash.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this,
0, notificationIntent, 0);
try {
pendingIntent.send();
} catch (PendingIntent.CanceledException e) {
e.printStackTrace();
}
}
}
}
我认为如果应用程序到达前台,它的优先级很高,那么它可以一直使用gps。
棘手的部分是当app在后台并且屏幕被锁定时,重新打开应用程序后调用onPause()(将其置于前台)意味着activityVisible被设置为false(意味着不可见,这不是真的),实际上它是正确的,但它不是我想要的,解决这个问题我永远不会在屏幕被锁定时设置activityVisible,并且当我在splash中重新打开app时,我将activityVisible设置为true。
希望它可以帮助......