【问题标题】:How to implement FusedLocationProviderClient as a Service?如何将 FusedLocationProviderClient 实现为服务?
【发布时间】:2018-08-18 22:35:31
【问题描述】:

自从这次新的 Android 8 更新发布以来,许多limitations 强加于后台服务的工作方式。

所以我的应用需要在后台定期获取用户的位置,为此,我考虑使用 Android 网站建议的 FusedLocationProviderClient。 获取位置后,我只需要对信息进行一些简单的处理。

现在我开发了这个代码示例:

private fun updateLocation(){
    //Location Request
    val mLocationRequest = LocationRequest();
    mLocationRequest.smallestDisplacement = 1000f;
    mLocationRequest.interval = 5*60*1000;
    mLocationRequest.priority = LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY;

    //Location Provider
    val mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)

    //Check Location Permission
    if(PermissionChecker.checkSelfPermission(this,ACCESS_FINE_LOCATION)==PackageManager.PERMISSION_GRANTED)

    //Request Location
      mFusedLocationProviderClient.requestLocationUpdates(mLocationRequest,locationCallback,null);
}

private val locationCallback = object:LocationCallback(){
    override fun onLocationResult(locationResult: LocationResult?) {
        doSomeWork()
    }
}

所以我有一个问题:

问。每次我想更新位置时是否应该使用计划作业?

如果我希望我的应用在活动已关闭的情况下也能获得更新,这听起来像是服务的工作,对吧?但是有了这个新的更新,我的服务不会永远运行,所以它迟早会被杀死。

使用定期安排的作业,服务将在满足条件时启动,但安排定期作业来更新位置似乎有点奇怪,而不是使用利用IntervalSmallestDisplacement 以获得新的更新。

每次满足 LocationRequest 的条件(本示例中的间隔和/或 minimumDisplacement)时,requestLocationUpdates() 都会调用他的回调。这就是我想要完成的工作,我想要一份请求位置更新的工作,不是多个重新安排的工作,因为我需要请求位置的更新。

有没有其他更好的方法来完成我想说的或者我需要这种新的计划作业方法?

无论如何,对于这篇凌乱的帖子感到抱歉,这是我在 Stack Overflow 上的第一个问题 谢谢:)

【问题讨论】:

标签: android kotlin


【解决方案1】:

为此使用Geofencing API。这为您提供了可以在 IntentService 中处理的意图。无需通知。

您只需在当前位置设置一个半径为 1000m 的新地理围栏,然后等待用户离开。

【讨论】:

  • 我已阅读文档,但从用户的角度来看,每次应用需要时收到应用正在获取位置的通知并不令人不安?
  • 文档指出,在后台时,“应用程序”每小时只能请求几次位置。我怀疑这意味着你要么必须在前台运行(任何你可以绑定的东西),要么咬紧牙关通知。如果你有一个有效的用例,用户会很感激的 ;)
  • 感谢您提醒我,我完全忘了计算该样本的数量。猜猜我会为 Android O 用户使用前台服务!
  • 看到你改变的问题我改变了答案。
【解决方案2】:

如果您希望您的服务在短时间内运行,您应该使用绑定服务或前台服务。如果您希望根据某些条件或大量时间触发某些特定的作业,您应该使用 JobScheduler。

【讨论】:

  • 我希望我的服务运行假设每次用户移动 1000 米,每次使用前台服务通知是否会令人不安?使用 JobScheduler 我需要在每次安排作业时调用 requestLocationUpdates() 。每次用户移动 1000 米时,该方法本身都会调用 LocationCallback,但由于活动被杀死,它不会调用回调。每次我想更新时调用新服务似乎有点不正确,因为 requestLocationUpdates() 方法已经通过它的回调“传递”更新。
  • 我不瘦JobScheduler可以在这里应用。前台服务是正确的。前台服务只会添加您的服务正在运行的通知。
  • 为此使用地理围栏 API。 developer.android.com/training/location/geofencing.html 为您提供可以在 IntentService 中处理的意图。无需通知。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-04
  • 1970-01-01
  • 2014-05-25
  • 2019-07-06
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
相关资源
最近更新 更多