2012-09-17 8 views
5

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?

risposta

1

Ahh ... Ho un errore errore di battitura. In realtà nel MyBroadCastREciever classe stavo registrando gpsListener il doppio:

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
    100, 0, 
    gpsLocationListener); 

locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 
    100, 0, 
    networkLocationListener); //previously was gpsLocationListener again. Wrong. 

che chi ascolta non è stato rimosso rete y.

+0

allora qual è la modifica che hai fatto? Come se rimuovessi il listener di rete, non riceverai aggiornamenti di rete. – amandroid

+0

sì perché voglio solo ottenere un singolo aggiornamento di posizione. –

0

Prova questo ..

lmNetwork.removeUpdates(networkLocationListener); 
lmGps.removeUpdates(gpsLocationListener); 
0

si può fare in questo modo, con una classe di insider e rimuovere l'ascoltatore onPause():

 @Override 
     protected void onPause() { 
       super.onPause(); 
       GPSlocationManager.removeUpdates(GPSLocationListener); 
       CellLOcationManager.removeUpdates(NetworkLocationListener); 
     } 

     private void SetLocationManager() { 
       GPSlocationManager =(LocationManager)getSystemService(Context.LOCATION_SERVICE); 
       CellLOcationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
       NetworkLocationListener = new MyNetworkLocationListener(); 
       GPSLocationListener = new MyGPSLocationListener(); 
       GPSlocationManager.requestLocationUpdates("gps", 5000, 1, GPSLocationListener); 
       CellLOcationManager.requestLocationUpdates("network", 10000, 1, NetworkLocationListener); 
     } 

     private class MyNetworkLocationListener implements LocationListener { 

       @Override 
       public void onLocationChanged(Location location) { 

       } 

       @Override 
       public void onStatusChanged(String s, int i, Bundle bundle) { 
       } 

       @Override 
       public void onProviderEnabled(String s) { 
       } 

       @Override 
       public void onProviderDisabled(String s) { 
       } 

     }