Android call a check for internet connection automatically

1.4k Views Asked by At

I'd like to know if there's a mechanism so whenever I try to use internet, somehow AUTOMATICALLY behind the scences this method (isNetworkAvailable) will be called.

The question is NOT about how to check for internet connection as I already know that:

public boolean isNetworkAvailable(){
    ConnectivityManager cm =
            (ConnectivityManager)ctx.getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    boolean isConnected = activeNetwork != null &&
                          activeNetwork.isConnectedOrConnecting();
    return isConnected;
}

To clarify myself, I want to prevent from calling isNetworkAvailable() each time I use internet connection (either by my classes which I call explicitly or by third party classes I use that opens internet connections by themselves), so my code won't be filled everywhere with:

if(isNetworkAvailable()){
    // send message to server or open some other internet connection
}

But this function somehow will be called before each attempt to connect internet.

Hope I've cleared myself. Couldn't find a solution on SO.

P.S. My app CAN run on offline mode, so I don't want a simple broadcast reciever that blocks the app whenever there's no internet connection (like some apps do).

2

There are 2 best solutions below

1
On

I have used BroadCastReceiver, which will check my Internet connectivity automatically.

NetworkUtil.java

 public class NetworkUtil {

    public static final int NOT_CONNECTED = 0;
    public static final int WIFI = 1;
    public static final int MOBILE = 2;
    public static int getConnectionStatus(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        if (activeNetwork != null) {
            if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI)
                return WIFI;
            if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE)
                return MOBILE;
        }
        return NOT_CONNECTED;
    }
}

NetworkConnectivityCheck.java

public class NetworkConnectivityCheck {
    public boolean internetAvailable = false;
    private BroadcastReceiver networkChangeReceiver;
    public NetworkConnectivityCheck() {
        this.networkChangeReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                int networkState = NetworkUtil.getConnectionStatus(context);
                if (networkState == NetworkUtil.NOT_CONNECTED) {
                    Log.i("InternetApplication", "Internet is not available.");
                    internetAvailable = false;
                    getInternetStatus();
                } else if (networkState == NetworkUtil.MOBILE) {
                    Log.i("InternetApplication", "Internet is available through mobile data.");
                    internetAvailable = true;
                    getInternetStatus();
                } else if (networkState == NetworkUtil.WIFI) {
                    Log.i("InternetApplication", "Internet is available through wifi.");
                    internetAvailable = true;
                    getInternetStatus();
                }
            }
        };
    }
    public boolean getInternetStatus(){
        Log.d("InternetApplication", "Value of Internet is " + String.valueOf(internetAvailable));
        return this.internetAvailable;
    }
    public void register(Context context){
        context.registerReceiver(networkChangeReceiver, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"));
    }
    public void unregister(Context context){
        context.unregisterReceiver(networkChangeReceiver);
    }
}

After these two files, just initialise the class before onCreate Method , it will look like this.

MainActivity.java

//Internet Connectivity Check
    private NetworkConnectivityCheck status = new NetworkConnectivityCheck();
    public void networkStatusCheck(){}


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        networkStatusCheck();
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sample);
}
1
On

below code helps for you,

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()) {
            // Do something

            Log.d("Netowk Available ", "Flag No 1");
        }
    }
}

in manifest,

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><receiver android:name=".NetworkChangeReceiver" >
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
        </intent-filter>
    </receiver>