I am looking at LocationManager to get best location for periodical reporting location. I am curious about LocationManager.requestLocationUpdates method. What would it happen if I invoke this method several times with different minTime and minDistance without calling removeUpdates? Will it add new request or just update the existing one?
I am trying to test this, it is not bit easy at the moment. Your answer would be appreciated.
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
It will update the existing request.
回答2:
You could register it multiple times. see my code below.
package com.test.locationmanager; import android.app.Activity; import android.content.Context; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.location.LocationProvider; import android.os.Bundle; import android.widget.TextView; public class LocationManagerStatus extends Activity { private LocationManager locationManager; private TextView textView; private final LocationListener gpsLocationListener =new LocationListener(){ @Override public void onStatusChanged(String provider, int status, Bundle extras) { final String tvTxt = textView.getText().toString(); switch (status) { case LocationProvider.AVAILABLE: textView.setText(tvTxt + "GPS available again\n"); break; case LocationProvider.OUT_OF_SERVICE: textView.setText(tvTxt + "GPS out of service\n"); break; case LocationProvider.TEMPORARILY_UNAVAILABLE: textView.setText(tvTxt + "GPS temporarily unavailable\n"); break; } } @Override public void onProviderEnabled(String provider) { textView.setText(textView.getText().toString() + "GPS Provider Enabled\n"); } @Override public void onProviderDisabled(String provider) { textView.setText(textView.getText().toString() + "GPS Provider Disabled\n"); } @Override public void onLocationChanged(Location location) { locationManager.removeUpdates(networkLocationListener); textView.setText(textView.getText().toString() + "New GPS location: " + String.format("%9.6f", location.getLatitude()) + ", " + String.format("%9.6f", location.getLongitude()) + "\n"); } }; private final LocationListener networkLocationListener = new LocationListener(){ @Override public void onStatusChanged(String provider, int status, Bundle extras){ final String tvTxt = textView.getText().toString(); switch (status) { case LocationProvider.AVAILABLE: textView.setText(tvTxt + "Network location available again\n"); break; case LocationProvider.OUT_OF_SERVICE: textView.setText(tvTxt + "Network location out of service\n"); break; case LocationProvider.TEMPORARILY_UNAVAILABLE: textView.setText(tvTxt + "Network location temporarily unavailable\n"); break; } } @Override public void onProviderEnabled(String provider) { textView.setText(textView.getText().toString() + "Network Provider Enabled\n"); } @Override public void onProviderDisabled(String provider) { textView.setText(textView.getText().toString() + "Network Provider Disabled\n"); } @Override public void onLocationChanged(Location location) { textView.setText(textView.getText().toString() + "New network location: " + String.format("%9.6f", location.getLatitude()) + ", " + String.format("%9.6f", location.getLongitude()) + "\n"); } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); textView = (TextView) findViewById(R.id.textview); locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); } @Override protected void onResume() { super.onResume(); locationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, 5000, 0, networkLocationListener); locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, 0, gpsLocationListener); } @Override protected void onPause() { super.onPause(); locationManager.removeUpdates(networkLocationListener); locationManager.removeUpdates(gpsLocationListener); } } 回答3:
Use new Location API's for android, they have made it much accurate and consume less battery efficiency.