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

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

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

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

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

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

【问题讨论】:

    标签: android gps location


    【解决方案1】:

    使用FusedLocationAPIlocation 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 方法呢?

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-08
          • 1970-01-01
          • 1970-01-01
          • 2011-11-09
          • 2023-03-16
          • 2018-05-25
          相关资源
          最近更新 更多