11、位置请求:LocationRequest参数详解、优先级设置与更新间隔配置

各位好,我是你们的老朋友。今天我们来聊聊 LocationRequest 这个类。说实话,很多新手开发者觉得它就是个配置对象,填几个参数就完事了。但我在项目中踩过不少坑,发现参数配不好,要么耗电如流水,要么定位慢得像蜗牛。今天我就把压箱底的经验都掏出来,咱们好好捋一捋。

LocationRequest 是什么?

说白了,LocationRequest 就是告诉系统:「嘿,我需要什么样的位置信息」。它决定了定位的精度、频率、甚至功耗。你可以把它想象成一张订单,你填好需求,系统按单发货。

我个人习惯在创建 LocationRequest 时,先想清楚业务场景。是导航?还是签到打卡?场景不同,参数天差地别。

核心参数详解

咱们一个一个来看,每个参数我都结合项目经验讲。

1. 优先级(Priority)

这是最重要的参数,没有之一。它告诉系统你有多「急」。

优先级常量 含义 典型场景
PRIORITY_HIGH_ACCURACY 高精度,优先使用GPS 导航、跑步轨迹
PRIORITY_BALANCED_POWER_ACCURACY 平衡精度,约100米 天气App、附近推荐
PRIORITY_LOW_POWER 低功耗,约10公里 城市级别定位
PRIORITY_NO_POWER 不主动请求,被动接收 后台监听其他App的定位

重点提醒: PRIORITY_HIGH_ACCURACY 会强制开启GPS,耗电非常快。我见过一个项目,签到功能用了这个优先级,结果用户半天就没电了。后来改成 BALANCED,体验好了很多。

为什么会这样?因为GPS模块是手机里最耗电的硬件之一。你想想看,如果只是判断用户在不在某个城市,用GPS就是杀鸡用牛刀。

2. 更新间隔(Interval)

这个参数控制系统多久给你一次位置更新。单位是毫秒。

// 每10秒更新一次
request.setInterval(10000);

嗯,这里要注意:这个间隔是「建议值」,不是「强制值」。系统可能会根据其他App的请求合并处理,实际间隔可能比设置的长一些。我在做运动轨迹记录时,设了5秒间隔,但实际有时会跳到8秒。后来我加了 setFastestInterval 才稳住。

3. 最快更新间隔(FastestInterval)

这个参数是给系统一个「底线」:你不能比这个更快了。

// 最快每5秒更新一次
request.setFastestInterval(5000);

举个例子:你设了 Interval 为30秒,但系统可能因为其他App的请求,每5秒就给你一次位置。如果你不想这么频繁,就用 FastestInterval 限制住。

我的习惯: 通常把 FastestInterval 设为 Interval 的一半。比如 Interval 是10秒,Fastest 就设5秒。这样既保证流畅,又不会太耗电。

4. 最小位移(SmallestDisplacement)

这个参数很实用:只有移动超过指定距离(米),才触发更新。

// 移动超过10米才更新
request.setSmallestDisplacement(10);

我曾经做过一个外卖配送App,骑手在原地等单时,位置一直在飘。加了10米的最小位移后,更新频率降了80%,电量也省了不少。

5. 过期时间(ExpirationTime)

设置请求的有效时长。超过这个时间,系统自动停止定位。

// 5分钟后自动停止
request.setExpirationDuration(5 * 60 * 1000);

这个参数在一次性定位场景中很好用。比如用户点击「签到」,你只需要一次位置,设个30秒过期就够了,避免忘记取消请求导致一直耗电。

完整配置示例

下面是一个我常用的配置模板,适用于大多数场景:

LocationRequest request = new LocationRequest();
request.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
request.setInterval(10000);          // 10秒
request.setFastestInterval(5000);    // 最快5秒
request.setSmallestDisplacement(10); // 移动10米才更新
request.setExpirationDuration(30 * 60 * 1000); // 30分钟过期

这个配置适合「附近商家推荐」这类场景。精度够用,功耗也控制得不错。

避坑指南

我踩过的坑,今天全抖出来:

  • 别把 Interval 设得太小。 我曾经设了1秒,结果手机发烫,用户直接卸载了App。1秒更新一次,GPS根本扛不住。
  • 别忘了检查权限。 即使配好了 LocationRequest,没有权限也是白搭。运行时一定要先检查 ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION
  • 模拟器测试不准。 在模拟器上设 PRIORITY_HIGH_ACCURACY 可能秒定,但真机在室内可能几分钟都没信号。建议真机调试。
  • 后台定位要谨慎。 Android 8.0 以后,后台定位限制很严。如果App在后台,即使设了 Interval,系统也可能合并更新。这时候可以考虑前台服务。

警告: 不要为了省电把 Interval 设得很大,比如10分钟。这样用户打开App时,位置还是10分钟前的,体验很差。我建议最长不超过60秒。

知识体系图

下面这张图总结了 LocationRequest 的核心逻辑,我画了很久,希望能帮大家理清思路:

LocationRequest 参数决策树 LocationRequest 优先级 (Priority) HIGH_ACCURACY BALANCED 更新间隔 (Interval) Interval FastestInterval 其他参数 SmallestDisplacement ExpirationTime

从图上可以看得很清楚:LocationRequest 的核心就两块——优先级和间隔。其他参数都是在这两个基础上做微调。我个人建议,新手先掌握 PriorityInterval,其他参数遇到具体场景再查文档也不迟。

总结

好了,今天的内容就到这里。记住一句话:没有最好的配置,只有最适合场景的配置。多测试、多观察电量消耗,慢慢你就能找到感觉。

如果你在配置过程中遇到奇怪的问题,不妨回头看看是不是 FastestInterval 设得太小,或者 Priority 选得太高。这两个坑,我替你们踩过了。


公众号:蓝海资料掘金营,微信 deep3321