I've an app that gets a location fix. The app is to be rolled out to phones from Gingerbread up. Once the app gets a location fix a toast message is displayed to the user. The problem is when the user moves to the next activity the toast message appears maybe ten more times.
I think i've implemented the lifecycles correctly eg
1) get a location manager in onCreate() 2) create and pass a location listener to the manager in onResume() 3) remove updates in onStop()
I understand i can bypass this problem in Android > 4.x by calling
mlocManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, mlocListener, null);
but i have to accommodate Gingerbread so calling a single request is not in api 2.3.x. It works fine on Android 4 but on gingerbread the onLocationChanged method keeps executing another 10 times.
How can i force the onLocationChanged method to run only once on gingerbread?
thanks.
[edit] I've noticed that when i move to the next activity the onlocationchanged method keeps executing but if i move to a further activity then the location requests are successfully removed
@Override
protected void onStop() {
mlocManager.removeUpdates(mlocListener);
mlocListener = null;
super.onStop();
}
@Override
protected void onResume() {
mlocListener = new MyLocationListener();
if(isCompOptionsReceived == true){
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.GINGERBREAD_MR1) {
mlocManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, mlocListener, null);
}else{
mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener);
}
}
super.onResume();
}
private class MyLocationListener implements LocationListener {
@Override
public void onLocationChanged(Location loc) {
//toast message
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
}//end of MyLocationListener
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
nfcscannerapplication = (NfcScannerApplication) getApplication();
sIs = savedInstanceState;
setContentView(R.layout.entryscreen);
mlocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
The following code should be executed on the onPause method, not in the onStop
mlocManager.removeUpdates(mlocListener);
mlocListener = null;
That will fix it for all the android versions.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With