Home » Android » android – BroadcastReceiver when wifi or 3g network state changed

android – BroadcastReceiver when wifi or 3g network state changed

Posted by: admin April 23, 2020 Leave a comment


I have an app which updates the database whenever the phone is connected to WiFi. I have implemented a Service and BroadcastReceiver which will run the Service (it will tell me what network is in use), but the problem is I don’t know what to add in the manifest file to start BroadcastReceiver when the network state changes or when it connects to some kind of network

How to&Answers:

You need

<action android:name="android.net.wifi.WIFI_STATE_CHANGED"/>
<action android:name="android.net.wifi.STATE_CHANGE"/>

In your receiver tag.

Or if you want more control over it, before registering BroadcastReceiver set these up:

final IntentFilter filters = new IntentFilter();
super.registerReceiver(yourReceiver, filters);


Broadcast <intent-action> indicating that Wi-Fi has been enabled, disabled, enabling, disabling, or unknown. One extra provides this state as an int. Another extra provides the previous state, if available.


Broadcast <intent-action> indicating that the state of Wi-Fi connectivity has changed. One extra provides the new state in the form of a NetworkInfo object. If the new state is CONNECTED, additional extras may provide the BSSID and WifiInfo of the access point. as a String

Also, you’ll need to specify the right permissions inside manifest tag:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

To check connectivity, you can use ConnectivityManager as it tells you what type of connection is available.

ConnectivityManager conMngr = (ConnectivityManager)this.getSystemService(this.CONNECTIVITY_SERVICE);
android.net.NetworkInfo wifi = conMngr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
android.net.NetworkInfo mobile = conMngr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);


This is what I do to get notified when connection has changed.
You define a BroadCastReceiver to receive the broadcast.

public class NetworkChangeReceiver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo wifi = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        NetworkInfo mobile = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

        boolean isConnected = wifi != null && wifi.isConnectedOrConnecting() ||
            mobile != null && mobile.isConnectedOrConnecting();
        if (isConnected) {
            Log.d("Network Available ", "YES");
        } else {
            Log.d("Network Available ", "NO");

You also have to define that BroadcastReceiver in your manifest file and filter by ConnectivityChange.

<receiver android:name=".NetworkChangeReceiver" >
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />

Source here


To complement @Dantalian’s answer. Starting with Android Nougat you should not declare your receiver on your Manifest because it will not receive the CONNECTIVITY_ACTION broadcast. You should instead register your receiver using the Context.registerReceiver(Receiver, Intent) method.

Link to the source here


You should make an BroadcastReceiver that will be triggered when the connectivity status has changed :

Here Same question How to check the Internet Connection periodically in whole application?


Declare the intent filter to pass to the broadcastreceiver

IntentFilter filter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
registerReceiver(mReceiver, filter);

In the broadcast receiver, check for EXTRA_WIFI_STATE;

private BroadcastReceiver mReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        switch (action)
            case WifiManager.WIFI_STATE_CHANGED_ACTION:
                int extra = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,0);