2010-01-29 9 views
0

나는 와이파이 연결 상태의 변화를 알아 듣고 방송 수신기의 몇 가지를 가지고 와이파이 클래스가, 와이파이 RSSI 수준 등 ... 내가 또 다른 "엔진"개체에이 데이터를 전달 할 수 있도록하려는Android - BroadcastReciever에서 다른 객체로 데이터 전달 중?

여전히 데이터를 동적으로 변경하지 마십시오.

"엔진"클래스 내에 Wifi 개체를 만들고 메서드를 실행하면 데이터가 log cat의 Log 문에 동적으로 잘 표시됩니다.

내 문제는 동적으로 변경되는 데이터를 엔진에 가져 오려고 할 때 데이터를 가져 와서 첫 번째 값을 가져 와서 업데이트하지 않고 그대로 둡니다.

그래서 내 옵션이 어떻게 수행되는지 궁금합니다.

와이파이 클래스

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; 

그리고 내 엔진 코드 : : 그 어떤 도움 경우 아래

내 현재 코드 설정이다

공공 엔진 (문맥 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); 

} 

}

그래서 브로드 캐스트 수신기에서 변경 사항을 수신 할 때 Wifi 클래스의 데이터가 엔진에서 지속적으로 업데이트되도록 최선의 솔루션이 될지 궁금합니다. 클래스 경우

답변

0

가 따라 사전에

감사합니다, 최신 상태를 통지해야 하나. Activity에서 생성되지 않고 정적 인 (singletone 또는 Application 기반) 클래스 인 경우 Reciver에서 singletone 클래스를 업데이트해야합니다.

활동 기반 인 경우 브로드 캐스트를 고정해야하며 브로드 캐스트를 받으면 고정 브로드 캐스트를 제거하십시오.