2010-01-29 10 views
0

J'ai une classe Wifi qui a un couple de récepteurs de diffusion qui écoutent les changements dans l'état de connexion Wifi, Wifi Rssi etc ...Android - Passer des données de BroadcastReciever à un autre objet?

Je veux être en mesure de transmettre ces données à un autre objet "Moteur" et gardez toujours les données en évolution dynamique.

Je crée actuellement un objet Wifi dans la classe "Engine" et exécute ses méthodes, les données sont ensuite affichées dynamiquement dans les instructions Log du chat.

Mon problème est d'essayer d'obtenir les données dynamiquement changeantes au moteur, quand j'essaye d'obtenir des données dessus obtient la première valeur et la laisse à cela sans jamais mettre à jour.

Alors je me demandais quelles sont mes options sur la façon de faire cela?

ci-dessous est ma configuration actuelle de code si c'est une aide:

Wifi Classe

public Wifi(Context context){ 

    mainWifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 

} 

public int getCurrentWifiState() { 
    return currentWifiState; 
} 


public void setCurrentWifiState(int currentWifiState) { 
    this.currentWifiState = currentWifiState; 
} 



public String getConnectedSSID() { 
    return connectedSSID; 
} 


public void setConnectedSSID(String connectedSSID) { 
    this.connectedSSID = connectedSSID; 
} 


public int getConnectedLevel() { 
    return connectedLevel; 
} 


public void setConnectedLevel(int connectedLevel) { 
    this.connectedLevel = connectedLevel; 
} 

//method to do a scan and receive info about all access points available 
public List<ScanResult> scan(final Context context){ 

       receiverWifi = new WifiReceiver(); 
       mainWifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 

       context.registerReceiver(receiverWifi, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); 
       mainWifi.startScan(); 
       Log.d("WIFI DEBUG","\nStarting Scan...\n"); 
       wifiList = mainWifi.getScanResults(); 



    return wifiList; 
} 

class WifiReceiver extends BroadcastReceiver { 
    public void onReceive(Context c, Intent intent) { 
      sb = new StringBuilder(); 
      wifiList = mainWifi.getScanResults(); 
      ListIterator<ScanResult> results = wifiList.listIterator(); 

      while (results.hasNext()) { 
       ScanResult info = results.next(); 
       String wifiInfo = "Name: " + info.SSID + "; capabilities = " + info.capabilities + "; sig str = " + info.level + "dBm"; 
       Log.v("WiFi", wifiInfo); 
       Log.d("Signal Level", "Signal Level : " + mainWifi.calculateSignalLevel(info.level, 5)); 

      } 

    } 

} 

//method to listen for changes in the level of the wifi connection 
public void initializeWiFiListener(Context context){ 
     Log.d("WIFI", "executing initializeWiFiListener"); 

     String connectivity_context = Context.WIFI_SERVICE; 
     final WifiManager wifi = (WifiManager)context.getSystemService(connectivity_context); 

     if(!wifi.isWifiEnabled()){ 
       if(wifi.getWifiState() != WifiManager.WIFI_STATE_ENABLING){ 
         //wifi.setWifiEnabled(true); 
       } 
     } 
     rssiListener = new BroadcastReceiver(){ 

       @Override 
       public void onReceive(Context context, Intent intent) { 
         String action = intent.getAction(); 

         if(WifiManager.RSSI_CHANGED_ACTION.equals(action)){ 
          WifiInfo data = mainWifi.getConnectionInfo(); 
          Log.d("WIFI", "RSSI has changed"); 
          if(mainWifi.getConnectionInfo()!=null){ 
          setConnectedSSID(data.getSSID()); 
          setConnectedLevel(data.getRssi()); 
          Log.d("WIFI", "new RSSI = " + data.getSSID()+ " " + data.getRssi() + "dBm"); 
          } 
         }  
       } 
     }; 
     //leak here - need to de reg receiver 
     context.registerReceiver(rssiListener, new IntentFilter(WifiManager.RSSI_CHANGED_ACTION)); 
} 

//method to listen for changes in the connection to a wifi access point 
public void changeWiFiListener(Context context){ 
     Log.d("WIFI", "executing initializeWiFiListener"); 

     String connectivity_context = Context.WIFI_SERVICE; 
     final WifiManager wifi = (WifiManager)context.getSystemService(connectivity_context); 

     if(!wifi.isWifiEnabled()){ 
       if(wifi.getWifiState() != WifiManager.WIFI_STATE_ENABLING){ 
         //wifi.setWifiEnabled(true); 
       } 
     } 
     wifiChangeListener = new BroadcastReceiver(){ 

       @Override 
       public void onReceive(Context context, Intent intent) { 
         String action = intent.getAction(); 

         if(WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)){ 

          Log.d("WIFI", "WIFI has changed"); 
          int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, -1); 
          Log.d("WIFI", "WIFI State = " + wifiState); 
          setCurrentWifiState(wifiState); 

         } 
       } 
     }; 
     //Leak here - not unregistering receiver 
     context.registerReceiver(wifiChangeListener, new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION)); 
} 

public WifiReceiver getReceiverWifi() { 
    return receiverWifi; 
} 

public void setReceiverWifi(WifiReceiver receiverWifi) { 
    this.receiverWifi = receiverWifi; 

Et mon Code moteur:

Engine publique (Contexte aContext) {

context = aContext; 

    cm = new CallManager(aContext); 

    wifiManager = new Wifi(context); 
    wifiManager.initializeWiFiListener(context); 
    wifiManager.changeWiFiListener(context);  

    clc = new CallLogController(); 
} 

public void controlCalls(){ 

    int currentWifiState = wifiManager.getCurrentWifiState(); 
    cm.monitorOutgoingCalls(context, currentWifiState, clc); 

} 


public void unRegAllRecievers(){ 

    wifiManager.unregRegisters(context); 
    cm.unRegReciever(context); 

} 

public void doWifiScan(){ 


    scanTask = new TimerTask() { 
     public void run() { 
       handler.post(new Runnable() { 
         public void run() { 
          wifiManager.scan(context); 
          Log.d("TIMER", "Timer set off"); 
         } 
       }); 
     }}; 


    t.schedule(scanTask, 300, 30000); 

} 

public void stopScan(){ 

     scanTask.cancel(); 
     t.cancel(); 
     //boolean tf = scanTask.cancel(); 
     //Log.d("TIMER", "Timer True or False? : " + tf); 

} 

}

Donc, je me demandais quelle serait la meilleure solution pour s'assurer que les données de la classe Wifi sont constamment mises à jour dans le moteur quand il reçoit des changements du récepteur de diffusion?

Merci à l'avance

Répondre

0

si votre classe dépendances, celui qui devrait être informé du dernier état. Si c'est une classe qui n'est pas créée dans une activité et qui est statique (singletone ou basée sur une application), vous devriez probablement faire en sorte que Reciver mette à jour la classe singletone. Si c'est basé sur l'activité, vous avez besoin de diffuser des diffusions, et une fois la diffusion reçue, supprimez la diffusion persistante.