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;