如何在周期性启动的Service中为FusedLocation的addOnSuccessListener提供参数?
在Service中使用FusedLocationProviderClient的正确姿势
嘿,我来帮你搞定这个问题!在Service里确实没法直接给addOnSuccessListener()传Activity,但我们有两个简单靠谱的方案:
方案一:用Service自带的主线程Executor
Service本身提供了getMainExecutor()方法,它会返回一个绑定到Service主线程的Executor,完美适配addOnSuccessListener()的参数要求。而且回调会在主线程执行,不用额外处理线程切换的问题,代码示例如下:
public class LocationCheckService extends Service{ private FusedLocationProviderClient mFusedLocationClient; @Override public void onCreate() { super.onCreate(); mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this); // 调用getLastLocation并传入主线程Executor mFusedLocationClient.getLastLocation() .addOnSuccessListener(getMainExecutor(), location -> { // 处理获取到的位置 if (location != null) { double latitude = location.getLatitude(); double longitude = location.getLongitude(); // 这里写你的业务逻辑 } }) .addOnFailureListener(getMainExecutor(), e -> { // 处理定位失败的情况,比如权限不足、定位未开启等 e.printStackTrace(); }); } // 别忘了实现Service的其他必要方法 @Nullable @Override public IBinder onBind(Intent intent) { return null; } }
方案二:自定义Executor(适合非UI操作场景)
如果你的定位回调不需要在主线程执行(比如只是处理数据、上传服务器),也可以自己创建一个Executor,比如用Executors.newSingleThreadExecutor():
Executor customExecutor = Executors.newSingleThreadExecutor(); mFusedLocationClient.getLastLocation() .addOnSuccessListener(customExecutor, location -> { // 在这里执行后台任务 });
不过要注意,这种自定义Executor的线程需要自己管理,避免内存泄漏,所以更推荐方案一,省心又安全。
额外提醒
别忘了检查定位权限!Android 6.0+需要动态申请ACCESS_FINE_LOCATION或ACCESS_COARSE_LOCATION,Android 10及以上如果是后台定位,还需要申请ACCESS_BACKGROUND_LOCATION权限,否则可能拿不到位置数据哦。
内容的提问来源于stack exchange,提问作者Hitrene
相关产品推荐
相关产品推荐

