LocationManager#requestLocationUpdates()
ドキュメントから:
Jellybean より前は、minTime パラメーターは単なるヒントであり、一部のロケーション プロバイダーの実装では無視されていました。Jellybean 以降では、Android 互換デバイスで minTime パラメーターと minDistance パラメーターの両方を監視することが必須です。
ただしrequestSingleUpdate()
、ルーパーとハンドラーを使用して、1 時間に 1 回更新を実行できます。
追加まず、ここでルーパーとハンドラー
の詳細を読むことができます。
良い選択である API 8 を使用していますが、これにより、呼び出すことができる LocationManager メソッドが制限されます。これは、ほとんどが API 9 で導入されたためです。API 8 には、次の 3 つのメソッドしかありません。
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);
}
};
もちろん、バックグラウンドで未使用の更新を取得して LocationManager がリソースを浪費するのを防ぐために、ですべてのコールバックを無効onPause()
にして再度有効にする必要があります。onResume()
より技術的なポイント:
LocationManager で UI スレッドをブロックすることを懸念している場合は、2 番目のrequestLocationUpdates()
方法を使用して、新しいスレッド (たとえば、HandlerThread) から特定のルーパーを提供できます。