在后台每 10 分钟检查一次位置

Posted

技术标签:

【中文标题】在后台每 10 分钟检查一次位置【英文标题】:Checking the location every 10 minutes in the background 【发布时间】:2016-08-11 01:22:08 【问题描述】:

我的要求是使用后台服务每 10 分钟检查一次设备的位置。所以每 10 分钟应该发生的事情的基本要点是 -

启动服务。 等待一分钟(最多)让侦听器获取位置,一旦获取位置,移除侦听器然后停止服务。 如果监听器没有响应,使用getLastKnownLocation(),移除监听器然后停止服务。 如果 GPS 关闭,它会向应用报告(此步骤运行正常)

到目前为止我尝试过的事情 -

使用 AlarmManager 每 10 分钟触发一次服务 在此服务中添加了位置侦听器。 来自 LocationListener 的 onLocationChanged() 包含方法 - stopSelf(),以便服务在收到位置后结束。但是,这种方法被调用了无数次。我在调试时检查了这一点。这是因为调用了许多 onLocationChanged() 实例吗?

我不需要完整的代码作为答案,我更希望我应该采用一种既能满足我的要求又不会对电池造成太大伤害的策略。与我的方法一样,除非并且直到找到该位置,否则 GPS 会保持打开状态,不断消耗电池电量。

【问题讨论】:

【参考方案1】:

使用FusedLocationAPI 和location request 代替每10 分钟安排一次的警报管理器以获得准确的位置。

            LocationRequest mLocationRequest = LocationRequest.create();
            mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);//Change to PRIORITY_HIGH_ACCURACY for more accurate.
            mLocationRequest.setInterval(600000); // Update location every 10 minute
            LocationServices.FusedLocationApi.requestLocationUpdates(
                    mGoogleApiClient, mLocationRequest, this);

在需要位置时调用此方法

/**
 * Get the Location Detail from Fused Location API.
 * @param mContext
 * @return
 */
private Location getLocationDetails(Context mContext) 
    Location location = null;
    if (mGoogleApiClient != null) 
        if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) 
            Log.d(TAG,"Location Permission Denied");
            return null;
        else 
            location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
        
    
    return location;

【讨论】:

【参考方案2】:

试试这个

// The minimum distance to change updates in meters
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters

// The minimum time between updates in milliseconds
private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 10; // 10 minute

更多信息示例试试这个

Try with this link click here

【讨论】:

【参考方案3】:

来自 LocationListener 的 onLocationChanged() 包含方法 - stopSelf(),以便服务在收到位置后结束。但是,这种方法被调用了无数次。我在调试时检查了这一点。这是因为调用了很多 onLocationChanged() 实例吗?

基本上,当您收到第一个位置时,也可以通过 stopSelf() 停止服务,这也没关系。

但是如何多次调用 onLocationChanged 方法呢?

服务关闭时您不会删除位置更新吗?

【讨论】:

以上是关于在后台每 10 分钟检查一次位置的主要内容,如果未能解决你的问题,请参考以下文章

用于跟踪用户位置的高效后台服务

应用程序在后台时如何检查位置?

如果车辆不移动,每 5 分钟更新一次 Android 位置

#题目:有10 台被监控主机一台监控机,在监控机上编写脚本,一旦某台被监控机器/ 分区适用率大于80%, 就发邮件报警放到crontab 里面, 每10 分钟检查一次

如何在 Android 中使用后台服务每 5 分钟获取一次设备位置?

每 5 分钟检查一次循环中的特定进程,持续 30 分钟