4. 设置定位请求的优先级与间隔
LocationRequest 的三个关键参数
在 FusedLocationProviderClient 中,定位行为由 LocationRequest 描述。与本节目标直接相关的参数有三个:setPriority() 决定定位源与精度取向,setInterval() 决定活跃更新间隔,setFastestInterval() 决定系统可用的最快回调上限。三者共同决定“精度—频率—耗电”的平衡点。
| 优先级常量 | 典型定位源 | 精度量级 | 耗电倾向 |
|---|---|---|---|
| PRIORITY_HIGH_ACCURACY | GPS + 网络 + 传感器融合 | 约 3–10 m(室外) | 高 |
| PRIORITY_BALANCED_POWER_ACCURACY | Wi‑Fi / 基站为主,GPS 按需 | 约 30–150 m | 中 |
| PRIORITY_LOW_POWER | 基站 / Wi‑Fi 粗定位 | 约 200 m–2 km | 低 |
间隔不是“越小越好”:
setInterval(1000) 在低功耗优先级下并不会真的每秒返回新位置,系统会按定位源能力与电量策略合并请求,实际回调可能远低于设定值。构建三种优先级请求并观察差异
下面用同一套回调逻辑分别注册三种优先级请求,通过日志对比精度与回调间隔。示例中 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() 明显小于低功耗配置;低功耗配置的实际回调间隔不小于设定值。