融合位置在几个小时后停止发送更新

时间:2017-09-21 10:07:40

标签: android location fusedlocationproviderapi android-fusedlocation

如果我打开应用程序几个小时,融合位置会停止发送更新...

我正在创建具有高优先级的位置请求,这里是代码:

<!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秒后,我手动停止位置更新...如果我整夜离开,这意味着活动整晚都活着...此后,当我请求位置时再次更新,它没有来......

任何解决方案或想法?

2 个答案:

答案 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。

希望它可以帮助......