4. 设置定位请求的优先级与间隔

设置定位请求的优先级与间隔 学习卡片

LocationRequest 的三个关键参数

在 FusedLocationProviderClient 中,定位行为由 LocationRequest 描述。与本节目标直接相关的参数有三个:setPriority() 决定定位源与精度取向,setInterval() 决定活跃更新间隔,setFastestInterval() 决定系统可用的最快回调上限。三者共同决定“精度—频率—耗电”的平衡点。

优先级常量典型定位源精度量级耗电倾向
PRIORITY_HIGH_ACCURACYGPS + 网络 + 传感器融合约 3–10 m(室外)高
PRIORITY_BALANCED_POWER_ACCURACYWi‑Fi / 基站为主,GPS 按需约 30–150 m中
PRIORITY_LOW_POWER基站 / Wi‑Fi 粗定位约 200 m–2 km低
间隔不是“越小越好”:setInterval(1000) 在低功耗优先级下并不会真的每秒返回新位置,系统会按定位源能力与电量策略合并请求,实际回调可能远低于设定值。
LocationRequest 参数 → 定位行为 → 精度/耗电 请求参数 setPriority(...) setInterval(ms) setFastestInterval(ms) 三者共同约束回调节奏 优先级决定定位源 HIGH_ACCURACY:GPS 融合 BALANCED:Wi‑Fi/基站 LOW_POWER:粗定位 可观测结果 • 回调位置精度(m) • 实际回调间隔(s) • 电量消耗速率 • 首次定位耗时 间隔参数的作用边界 interval=1s 高频,耗电快 interval=30s 平衡,常用 interval=5min 低频,省电 组合选择参考 导航/运动:HIGH + 1–5s 精度优先,接受高耗电 城市签到:BALANCED + 30s 精度与耗电折中 天气/城市级:LOW + 5min 省电优先,精度放宽

构建三种优先级请求并观察差异

下面用同一套回调逻辑分别注册三种优先级请求,通过日志对比精度与回调间隔。示例中 interval 与 fastestInterval 显式设置,便于观察系统实际回调节奏。

private FusedLocationProviderClient fusedClient;
private LocationCallback callback;

private void startWithPriority(int priority, long intervalMs) {
    LocationRequest request = LocationRequest.create()
            .setPriority(priority)
            .setInterval(intervalMs)
            .setFastestInterval(intervalMs / 2)
            .setWaitForAccurateLocation(false);

    callback = new LocationCallback() {
        @Override
        public void onLocationResult(LocationResult result) {
            Location loc = result.getLastLocation();
            if (loc == null) return;
            Log.d("LocPriority", "priority=" + priority
                    + " acc=" + loc.getAccuracy() + "m"
                    + " t=" + System.currentTimeMillis()
                    + " provider=" + loc.getProvider());
        }
    };

    if (ActivityCompat.checkSelfPermission(this,
            Manifest.permission.ACCESS_FINE_LOCATION)
            != PackageManager.PERMISSION_GRANTED) {
        return;
    }
    fusedClient.requestLocationUpdates(request, callback, Looper.getMainLooper());
}

// 依次测试三种优先级,每次测试后调用 stopUpdates()
// startWithPriority(Priority.PRIORITY_HIGH_ACCURACY, 2000);
// startWithPriority(Priority.PRIORITY_BALANCED_POWER_ACCURACY, 30000);
// startWithPriority(Priority.PRIORITY_LOW_POWER, 300000);

private void stopUpdates() {
    if (fusedClient != null && callback != null) {
        fusedClient.removeLocationUpdates(callback);
    }
}
测试时不要同时注册多个请求,否则系统会按最高优先级合并,无法区分单个配置的效果。每次切换优先级前先 removeLocationUpdates()。

结果判读与验证要点

  • 精度判读:读取 Location.getAccuracy(),高精度通常小于 10 m,平衡约 30–150 m,低功耗可能大于 200 m;室内差异更明显。
  • 间隔判读:用相邻两次回调的时间戳差值对比 setInterval()。低功耗下实际间隔常大于设定值,属于系统合并请求的正常行为。
  • 耗电观察:在系统设置的电量使用详情中查看应用耗电曲线,或使用 Battery Historian 对比三种配置下单位时间的耗电占比。
  • 首次定位耗时:记录从 requestLocationUpdates() 到第一次回调的时间,高精度冷启动通常最慢。
验证通过条件:三种优先级下均能收到回调;高精度配置的 getAccuracy() 明显小于低功耗配置;低功耗配置的实际回调间隔不小于设定值。