Android Fused location在几个小时后停止发送更新

Android Fused location在几个小时后停止发送更新,android,location,fusedlocationproviderapi,android-fusedlocation,Android,Location,Fusedlocationproviderapi,Android Fusedlocation,如果我让应用程序打开几个小时,就会停止发送更新 我正在创建具有高优先级的位置请求,下面是代码: LocationRequest = LocationRequest.create() .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) .setExpirationDuration(TimeUnit.SECONDS.toMillis(LOCATION_TIMEOUT_IN_SECON

如果我让应用程序打开几个小时,就会停止发送更新

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

LocationRequest = LocationRequest.create()
                .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
                .setExpirationDuration(TimeUnit.SECONDS.toMillis(LOCATION_TIMEOUT_IN_SECONDS))
                .setInterval(LOCATION_UPDATE_INTERVAL);
以下是客户端和回调:

LocationCallback mLocationCallback = new LocationCallback() {
        @Override
        public void onLocationAvailability(LocationAvailability locationAvailability) {
            super.onLocationAvailability(locationAvailability);
        }

        @Override
        public void onLocationResult(LocationResult locationResult) {
            super.onLocationResult(locationResult);
            //Update location
        }
    };
    mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
    mFusedLocationProviderClient.requestLocationUpdates(mLocationRequest, mLocationCallback, null);
LOCATION\u TIMEOUT\u IN\u SECONDS是5秒,但更新并不总是在运行,当我的应用程序需要LOCATION时,我会手动停止并启动它。就像这样

若应用程序运行一到两个小时,一切正常,但若我让它长时间打开,它就会停止工作

我在点击按钮时从活动中请求位置更新,10秒后,我手动停止位置更新。。。如果我整晚都离开它,这意味着整个晚上活动都是活跃的。。。在此之后,当我再次请求位置更新时,它不会出现

有什么解决办法或想法吗

setExpirationDuration(long millis)
从文档:

设置此请求的持续时间(以毫秒为单位)

持续时间立即开始(而不是在请求传递到location客户端时),因此,如果请求在以后重新使用,请再次调用此方法

位置客户端将在请求过期后自动停止更新

持续时间包括暂停时间。允许小于0的值,但表示请求已过期


如果您想永久接收位置更新,请将其删除或设置适当的时间。

以下是MyApplication类:

public class MyApplication extends Application  {

  public static boolean isActivityVisible() {
   return activityVisible;
 }

 public static void setVisibilityTrue() {
  activityVisible = true;
 }
这是我的基本活动类:

 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;
 }
}

}

当应用程序位于后台时,我们会将其带到前台,每隔30秒使用计时器检查应用程序屏幕是否锁定,如果锁定,我们会打开应用程序:
private void bringapplicationfront(上下文){
/**
*检查电机屏幕是否关闭/打开
* */
布尔值isScreenOn=true;
PowerManager pm=(PowerManager)
getSystemService(Context.POWER\u服务);
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.KITKAT\u WATCH){
isScreenOn=pm.isInteractive();
}否则{
isScreenOn=pm.isScreenOn();
}
如果(!IsCreenon){
/**
*检查app是否为前/后接地
* */
布尔值isInForeBackground=false;
试一试{
isInForeBackground=MyApplication.isActivityVisible();
}捕获(例外e){
e、 printStackTrace();
}
如果(!isInForeBackground){
意向通知意向=新意向(上下文,
ActivitySplash.class);
notificationIntent.setFlags(Intent.FLAG_活动_清除_顶部)
意图。标记活动(单个顶部);
PendingEvent PendingEvent=PendingEvent.getActivity(此,
0,通知意图,0);
试一试{
pendingent.send();
}捕获(PendingEvent.CanceledException e){
e、 printStackTrace();
}
}
}
}

我认为如果应用程序出现在前台,它的优先级很高,那么它可以一直使用gps

棘手的部分是,当应用程序位于后台且屏幕被锁定时,在重新打开应用程序后调用onPause()(将其置于前台)意味着activityVisible设置为false(意味着不可见,这不是真的),实际上它是正确的,但不是我想要的,为了解决这个问题,我从不让activityVisible在屏幕锁定时设置,当应用程序在splash中重新打开时,我将activityVisible设置为true


希望它能帮助

“停止工作”更具体一点位置更新不被称为您如何知道以及位置超时是什么_SECONDS@M.WaqasPervez当然,我没有:))
 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;