デバイスの GPS 位置のトレースを 2 分ごとに保存する必要があるアプリケーションを開発しています。
最初の試みはrequestLocationUpdatesを使用することでした:
locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 120000L, 0f, this);
テストには、Samsung Galaxy Mini (Android 2.3.5)を使用します。
USB ケーブルを接続してデバッグ モードでテストを行うと、すべてが完璧に機能し、2 分ごとに位置が取得されます。
問題は、USB を抜いて通りに出てテストするときです。このようにして、毎秒 GPS 位置を取得します。これは、やりすぎ。
コードをよく見直した後、タイマーを使用することにしました。
new Timer().scheduleAtFixedRate(new TimerTask(){
@Override
public void run() {
Location loc=getLastBestLocation(Activity.this);
GpsStore.save(loc);
}
}, 120000L, 120000L);
ここでも、USB ケーブルを使用してアプリケーションをデバッグ モードでテストすると、すべてがうまくいきます。
アプリケーションがフォアグラウンドにある場合はすべてうまくいきます。アプリケーションがバックグラウンドにある場合、TimerTask は 2 分ごとに実行されず、停止し、アプリケーションがフォアグラウンドに戻ると突然実行されます。 TimerTask は正常に実行されていました。しかし、すべてが約 1 秒ですばやく完了します。
繰り返しますが、コードをよく見直した後、Timer Handler の代わりに使用することにしました。
final Handler handler = new Handler();
Runnable runnable = new Runnable() {
public void run() {
Location loc=getLastBestLocation(Activity.this);
GpsStore.save(loc);
handler.removeCallbacks(this);
handler.postDelayed(this,120000L);
}
};
handler.removeCallbacks(runnable);
handler.postDelayed(runnable, 120000L);
いつものように、USB を使用したデバッグ モードではすべて正常に動作します。路上でテストを行ったときに何が起こるかというと、アプリケーションがハンドラーによってフォアグラウンドにあるときは、2 分ごとに正確に実行されないことがありますが、アプリケーションがバックグラウンドにあるときは Runnable を使用してHandler は 2 分ごとに実行されるわけではなく、実行されることはありません。
requestLocationUpdates だけを使用しますが、毎秒呼び出されます。
あなたの助けが必要です。ありがとうございました。