私は現在、次のようなアプリを書いています:
UI にはトグル ボタンが 1 つだけ含まれています。オンにすると、GPS 位置が外部サーバーに送信されます。オフにすると、何も起こりません。
ボタンがオンになっていて、アプリ (アクティビティ) が閉じられている場合、ボタンが再びオフになるまで、位置情報は送信されます。
どうすればこれを達成できますか? 多くのスレッドやチュートリアル、および dev.google.com を読みましたが、問題の最適な解決策を見つけることができませんでした。
私の現在のアプローチ:
MainActivity.java
public void onClick(View v) {
if (onOffButton.isChecked()) {
Intent startIntent = new Intent(this, LocationService.class);
startService(startIntent);
} else {
stopService(new Intent(this, LocationService.class));
}
}
LocationService.java
public class LocationService extends Service implements LocationListener {
final public static String START_ACTION = "START_LOCATION";
final public static int NOTE_ID = 1;
private int updateRate;
private LocationManager locationManager;
private NotificationManager notifyManager;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
// show popup message
Toast.makeText(this, getText(R.string.start_message), Toast.LENGTH_SHORT).show();
// display icon in status bar
requestLocationUpdates();
}
private void requestLocationUpdates() {
if(locationManager != null)
locationManager.removeUpdates(this);
// get location service
Criteria crit = new Criteria();
crit.setPowerRequirement(Criteria.ACCURACY_FINE);
String bestProvider = getLocationManager().getBestProvider(crit, true);
getLocationManager().requestLocationUpdates(bestProvider, updateRate * 1000,
0 /* minDist */, this);
LocationService.running = true;
}
@Override
public void onDestroy() {
super.onDestroy();
getLocationManager().removeUpdates(this);
notifyManager.cancel(NOTE_ID);
Toast.makeText(this, getText(R.string.stop_message), Toast.LENGTH_SHORT).show();
LocationService.running = false;
}
@Override
public void onLocationChanged(Location location) {
//Send Location to Server
}
@Override
public void onProviderDisabled(String provider) {
// TODO stop service, notify user
}
@Override
public void onProviderEnabled(String provider) {
requestLocationUpdates();
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO notify user
}
private LocationManager getLocationManager() {
if (this.locationManager == null)
this.locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
return this.locationManager;
}
}
インターネットで見つけた非常に古い gps トラッカーからこれを取得しました (onStart() は非推奨であり、onCommandStart() に置き換える必要があることを知っています)。一般的なアプローチが適切かどうかを知りたいだけです。
よろしく。