Android – передача изменяющихся данных из BroadcastReceiver в другой объект?

StackOverflow https://stackoverflow.com/questions/2163002

Вопрос

У меня есть класс Wi-Fi, в котором есть пара широковещательных приемников, которые прослушивают изменения в состоянии соединения Wi-Fi, уровнях Rssi Wi-Fi и т. д.

Я хочу иметь возможность передавать эти данные другому объекту «Engine» и при этом сохранять динамические изменения данных.

В настоящее время я создаю объект Wi-Fi в классе «Engine» и запускаю его методы, затем данные динамически отображаются в операторах журнала в журнале cat.

Моя проблема заключается в попытке передать динамически изменяющиеся данные в движок, когда я пытаюсь получить данные, он получает первое значение и оставляет его без обновления.

Итак, мне было интересно, какие у меня есть варианты, как это сделать?

Ниже приведена моя текущая настройка кода, если это поможет:

Класс Wi-Fi

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;

И мой код двигателя:

public Engine(Context 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);
    }
}

Итак, мне просто интересно, какое решение было бы лучшим, чтобы гарантировать, что данные класса Wi-Fi постоянно обновляются в движке, когда он получает изменения от приемника вещания?

Это было полезно?

Решение

зависит от того, является ли ваш класс тем, который должен быть уведомлен о последнем состоянии.Если это класс, который не создан в действии и является статическим (однотонным или основанным на приложении), вам, вероятно, следует попросить Reciver обновить однотоновый класс.

Если это основано на активности, вам нужно прикрепить трансляции, и как только трансляция будет получена, удалите прикрепленную трансляцию.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top