我目前正在编写一个应用程序,应该如下:
UI 仅包含一个切换按钮。如果打开,则 GPS 位置应发送到外部服务器。如果它被关闭,则不会发生任何事情。
如果 Button 已打开并且应用程序(活动)已关闭,则仍应发送位置,直到 Button 再次关闭。
我怎样才能做到这一点?我在 dev.google.com 和 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));
}
}
定位服务.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() 代替)我只是想知道一般方法是否好..
问候。