如何将FusedLocationProviderClient实现为服务?

7
自从新的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()
    }
}

所以我有一个问题:

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

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

使用定期计划的作业,服务将在满足条件时启动,但似乎很奇怪要安排定期作业来更新位置,而不是使用一个独特的服务,利用间隔最小位移进行新的更新。

requestLocationUpdates()在满足LocationRequest的条件(在此示例中为间隔和/或smallestDisplacement)时调用其回调。这就是我想要实现的,我想要一个请求位置更新的作业,不是多个作业重新安排,因为我需要请求位置。

是否有任何其他更好的方法来实现我所说的内容,或者我需要使用这种新的定时作业方法?

无论如何,对于这篇混乱的文章,抱歉,这是我在Stack Overflow上的第一个问题,谢谢 :)


1
我有一个类似的问题:https://dev59.com/PVQJ5IYBdhLWcg3wkGy- - individual8
2个回答

1
使用Geofencing API即可实现此功能。该API会提供一个Intent,您可以在IntentService中处理。无需通知。
您只需要在当前位置设置一个1000m半径的新地理围栏,并等待用户离开即可。

我已经阅读了文档,但从用户的角度来看,每次应用程序需要获取位置时都会收到通知,这不是有点令人不安吗? - ricardoatds
文档说明称,“应用程序”在后台只能每小时请求几次位置。我猜这意味着你要么在前台运行(任何可以绑定到的东西),要么接受通知的打击。如果您有一个有效的用例,用户会感激的;) - leonardkraemer
谢谢提醒,我完全忘记对那个样本进行计数了。看来我将为Android O用户使用前台服务! - ricardoatds
看到您修改了问题,我也修改了答案。 - leonardkraemer

0

如果您希望您的服务在短时间内运行,您应该使用Bound Service或Foreground Service。如果您想要根据某些条件或显著的时间量触发特定的作业,则应使用JobScheduler。


我希望我的服务每当用户移动1000米时运行一次,使用前台服务通知每次都会打扰吗?使用JobScheduler,我需要在每次调度作业时调用requestLocationUpdates()。该方法本身确实会在用户移动1000米时调用LocationCallback,但由于活动已被杀死,它不会调用回调。每次更新时调用新服务似乎有点不正确,因为requestLocationUpdates()方法已经通过其回调“传递”了更新。 - ricardoatds
我认为JobScheduler不能在这里应用。前台服务是正确的选择。前台服务将只添加通知,表明您的服务正在运行。 - Anton Kazakov
使用Geofencing API。https://developer.android.com/training/location/geofencing.html 这会给你一个Intent,你可以在IntentService中处理它。不需要通知。 - leonardkraemer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接