简体   繁体   中英

How to update the UI with BroadcastReceiver onReceive in Android?

I want to update the UI according to the WiFi status in my Android app in Java. I am unable to update the UI to show the new string. Please help me.

Here is my code

public class MainActivity extends AppCompatActivity {
    IntentFilter intentFilter = new IntentFilter();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        registerReceiver(new NetworkConnectionReceiver(), intentFilter);

        TextView displayStatus = findViewById(R.id.displayStateTextView);
    }
}

class NetworkConnectionReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        Log.i("MyReceiver", Boolean.toString(wifiManager.isWifiEnabled()));
    }
}

You can do it using interface

interface WifiStateListener{
  void onStateChanged(Boolean enabled);
}

Then add a constructor to pass the WifiStateListener to BroadcastReceiver

class NetworkConnectionReceiver extends BroadcastReceiver {
    private WifiStateListener mWifiStateListener;
    
    public NetworkConnectionReceiver(WifiStateListener wifistateListener){
        mWifiStateListener = wifistateListener;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        if(mWifiStateListener != null){
            mWifiStateListener.onStateChanged(wifiManager.isWifiEnabled());
        }
        Log.i("MyReceiver", Boolean.toString(wifiManager.isWifiEnabled()));
    }
}

And in Activity , while registering receiver you can pass the interface

registerReceiver(new NetworkConnectionReceiver(enabled -> {
    //do based on wifi state change
}), intentFilter);

Other options are to use EventBus, Observables etc

Use this code:

public class MainActivity extends AppCompatActivity {
...

    BroadcastReceiver br = new BroadcastReceiver(){
        @Override
        public void onReceive( Context context, Intent intent ){
           //update UI here directly
           View view = findViewById( R.id.example );
        }
    };

    @Override
    protected void onResume(){
        super.onResume();
        // Check state here
        ...
        IntentFilter filter = new IntentFilter();
        filter.addAction( ConnectivityManager.CONNECTIVITY_ACTION );
        registerReceiver( br, filter);
    }

    @Override
    protected void onPause(){
        super.onPause();
        unregisterReceiver( br );
    }

...
}

You can user LocalBroadCastManager.

First write broadCastReceiver in activity register that broadcast with LocalBroadCastManager in onResume unregister that broadcast with LocalBroadCastManager in onPause as well than write Broadcast of internet connection and call LocalBroadCastManager which you register in activity

    private BroadcastReceiver broadCastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
           if(intent.getAction() == "local_broadcast_update_UI"){
              updateUI()
           }
        }
    };

  @Override
  protected void onResume(){
     super.onResume();
     LocalBroadcastManager.getInstance(this).registerReceiver( broadCastReceiver, new 
     IntentFilter("local_broadcast_update_UI"));   
  }

  @Override
  protected void onPause(){
     super.onPause();
  LocalBroadcastManager.getInstance(this).unregisterReceiver("local_broadcast_update_UI");
  }

public class NetworkChangeReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(final Context context, final Intent intent) {
        final ConnectivityManager connMgr = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);

        final android.net.NetworkInfo wifi = connMgr
                .getNetworkInfo(ConnectivityManager.TYPE_WIFI);

        final android.net.NetworkInfo mobile = connMgr
                .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

        if (wifi.isAvailable() || mobile.isAvailable()) {
           LocalBroadcastManager.getInstance(context).sendBroadcast(new 
           Intent("local_broadcast_update_UI"));
        }
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM