如何实现FusedLocationProviderClient作为服务?

ric*_*tds 6 android kotlin

由于新的Android 8更新出现了,因此对后台服务的工作方式施加了很多限制.

所以我的应用需要定期获取用户位置的背景,为此,我考虑使用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()
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我有一个问题:

问:每次我想更新位置时,我是否应该使用预定作业?

如果我希望我的应用程序即使活动已经关闭也能获得更新,这听起来像是服务的工作吗?但是通过这些新的更新,我的服务不会永远运行,所以它迟早会被杀死.

使用定期计划的作业,该服务将在满足条件时启动,但是安排常规作业更新位置似乎有点奇怪,而不是使用使用IntervalSmallestDisplacement进行新更新的唯一服务.

每次满足LocationRequest的条件时,requestLocationUpdates()都会调用他的回调(此示例中的interval和/或smallestDisplacement).这就是我想要完成的任务,我想要一个请求位置更新的工作,而不是重新安排多个工作,因为我需要更新请求该位置.

有没有其他更好的方法来实现我想说的或者我需要这种新的预定工作方法?

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

leo*_*mer 1

为此,请使用地理围栏 API 。这给了你一个可以在 IntentService 中处理的意图。无需通知。

您所需要做的就是在当前位置设置一个半径为1000m的新地理围栏并等待用户离开。