如何实现FusedLocationProviderClient作为服务?

时间:2018-03-10 12:53:55

标签: android kotlin

由于新的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()
    }
}

所以我有一个问题:

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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