Lo scenario della mia app è che voglio monitorare la posizione dei dipendenti. Ho un broadcastreceiver che ascolta broadcast di avvio del dispositivo e registra un gestore di allarmi. Quando la gestione degli allarmi fa tic tac, registra due listener di posizione, uno per ascoltare gps e altro per la rete. Voglio che quando ho ottenuto il primo aggiornamento di posizione nel metodo onLocationChange(), salvare il percorso e annullare la registrazione di quel listener di posizione in modo che quando il gestore di allarmi spunta di nuovo, non ottiene duplicato. Per annullare la registrazione, ho gli ascoltatori di posizione come oggetti statici per accedervi in onLocationChange(). Ma ho scoperto che NON sta rimuovendo l'ascoltatore di posizione. Ecco il mio esempio di codice:LocationManager.removeUpdates (listener) non rimuove l'ascoltatore di posizione
public class BootTimeServiceActivator extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Calendar calendar = Calendar.getInstance();
AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent mIntent = new Intent(context, MyBroadCastReceiver.class);
PendingIntent mPendingIntent = PendingIntent.getBroadcast(context, 0, mIntent, PendingIntent.FLAG_CANCEL_CURRENT);
am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 20 * 60 * 1000, mPendingIntent);
}
}
//..........
public class MyBroadCastReceiver extends BroadcastReceiver{
public static LocationManager locationManager;
public static MyLocationListener networkLocationListener;
public static MyLocationListener gpsLocationListener;
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Toast.makeText(context, "Alarm has been called...", Toast.LENGTH_SHORT).show();
initLocationListeners(context);
registerLocationListeners();
}
public void initLocationListeners(Context context) {
locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
networkLocationListener = new MyLocationListener(context);
gpsLocationListener = new MyLocationListener(context);
}
public void registerLocationListeners() {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 100, 0, gpsLocationListener);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 100, 0, gpsLocationListener);
}
}
\\.....
public class MyLocationListener implements LocationListener {
Context context;
public MyLocationListener(Context context) {
this.context = context;
}
@Override
public void onLocationChanged(Location location) {
if(location != null) {
SDCardService sdService = new SDCardService(context);
try {
sdService.logToDB(location);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.d("provider",location.getProvider());
if(location.getProvider().equals(LocationManager.GPS_PROVIDER)) {
MyBroadCastReceiver.locationManager.removeUpdates(MyBroadCastReceiver.gpsLocationListener);
}
else if(location.getProvider().equals(LocationManager.NETWORK_PROVIDER)) {
MyBroadCastReceiver.locationManager.removeUpdates(MyBroadCastReceiver.networkLocationListener);
}
}
}
Qualcuno può guidarmi dove mi sbaglio?
allora qual è la modifica che hai fatto? Come se rimuovessi il listener di rete, non riceverai aggiornamenti di rete. – amandroid
sì perché voglio solo ottenere un singolo aggiornamento di posizione. –