来自LocationManager#requestLocationUpdates() 文档:
在 Jellybean 之前,minTime 参数只是一个提示,一些位置提供程序实现忽略了它。从 Jellybean 开始,Android 兼容设备必须遵守 minTime 和 minDistance 参数。
但是,您可以将 requestSingleUpdate() 与 Looper 和 Handler 一起使用,每小时运行一次更新。
加法
首先,您可以阅读有关Loopers and Handlers here 的更多信息。
您正在使用 API 8,这是一个不错的选择,但这限制了我们可以调用的 LocationManager 方法,因为大多数方法是在 API 9 中引入的。API 8 只有这三个方法:
requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener)
requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener, Looper looper)
requestLocationUpdates(String provider, long minTime, float minDistance, PendingIntent intent)
让我们使用第一种方法,它是最简单的。
首先,像往常一样创建您的 LocationManager 和 LocationListener,但在onLocationChanged() 停止请求更多更新:
@Override
public void onLocationChanged(Location location) {
mLocationManager.removeUpdates(mLocationListener);
// Use this one location however you please
}
其次,创建几个新的类变量:
private Handler mHandler = new Handler();
private Runnable onRequestLocation = new Runnable() {
@Override
public void run() {
// Ask for a location
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mLocationListener);
// Run this again in an hour
mHandler.postDelayed(onRequestLocation, DateUtils.HOUR_IN_MILLIS);
}
};
当然,您应该在onPause() 中禁用所有回调并在onResume() 中再次启用它们,以防止LocationManager 通过在后台获取未使用的更新而浪费资源。
更技术性的观点:
如果您担心使用 LocationManager 阻塞 UI 线程,那么您可以使用第二个 requestLocationUpdates() 方法从新线程(例如 HandlerThread)提供特定的 Looper。