Broadcast receiver for checking internet connection in android app Broadcast receiver for checking internet connection in android app android android

Broadcast receiver for checking internet connection in android app


Answer to your first question: Your broadcast receiver is being called two times because

You have added two <intent-filter>

  1. Change in network connection :
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />

  2. Change in WiFi state:
    <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />

Just use one:
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />.

It will respond to only one action instead of two. See here for more information.

Answer to your second question (you want receiver to call only one time if internet connection available):

Your code is perfect; you notify only when internet is available.

UPDATE

You can use this method to check your connectivity if you want just to check whether mobile is connected with the internet or not.

public boolean isOnline(Context context) {    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);    NetworkInfo netInfo = cm.getActiveNetworkInfo();    //should check null because in airplane mode it will be null    return (netInfo != null && netInfo.isConnected());}


public class NetworkChangeReceiver extends BroadcastReceiver {    @Override    public void onReceive(final Context context, final Intent intent) {        if (checkInternet(context)) {            Toast.makeText(context, "Network Available Do operations", Toast.LENGTH_LONG).show();        }    }    boolean checkInternet(Context context) {        ServiceManager serviceManager = new ServiceManager(context);        return serviceManager.isNetworkAvailable()    }}

ServiceManager.java

public class ServiceManager {    Context context;    public ServiceManager(Context base) {        context = base;    }    public boolean isNetworkAvailable() {        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);        NetworkInfo networkInfo = cm.getActiveNetworkInfo();        return networkInfo != null && networkInfo.isConnected();    }}

permissions:

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


Checking internet status every time using Broadcast Receiver:

internet status implementation

Full source code available on Google Drive.

AndroidManifest.xml

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

BroadcastReciever

package com.keshav.networkchangereceiverexample.receivers;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.net.ConnectivityManager;import android.net.NetworkInfo;import android.util.Log;import static com.keshav.networkchangereceiverexample.MainActivity.dialog;public class NetworkChangeReceiver extends BroadcastReceiver{    @Override    public void onReceive(Context context, Intent intent)    {        try        {            if (isOnline(context)) {                dialog(true);                Log.e("keshav", "Online Connect Intenet ");            } else {                dialog(false);                Log.e("keshav", "Conectivity Failure !!! ");            }        } catch (NullPointerException e) {            e.printStackTrace();        }    }    private boolean isOnline(Context context) {        try {            ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);            NetworkInfo netInfo = cm.getActiveNetworkInfo();            //should check null because in airplane mode it will be null            return (netInfo != null && netInfo.isConnected());        } catch (NullPointerException e) {            e.printStackTrace();            return false;        }    }}

MainActivity.java

package com.keshav.networkchangereceiverexample;import android.content.BroadcastReceiver;import android.content.Intent;import android.content.IntentFilter;import android.graphics.Color;import android.net.ConnectivityManager;import android.os.Build;import android.os.Handler;import android.os.Looper;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.animation.Animation;import android.view.animation.AnimationUtils;import android.widget.TextView;import com.keshav.networkchangereceiverexample.receivers.NetworkChangeReceiver;public class MainActivity extends AppCompatActivity {    private BroadcastReceiver mNetworkReceiver;    static TextView tv_check_connection;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        tv_check_connection=(TextView) findViewById(R.id.tv_check_connection);        mNetworkReceiver = new NetworkChangeReceiver();        registerNetworkBroadcastForNougat();    }    public static void dialog(boolean value){        if(value){            tv_check_connection.setText("We are back !!!");            tv_check_connection.setBackgroundColor(Color.GREEN);            tv_check_connection.setTextColor(Color.WHITE);            Handler handler = new Handler();            Runnable delayrunnable = new Runnable() {                @Override                public void run() {                    tv_check_connection.setVisibility(View.GONE);                }            };            handler.postDelayed(delayrunnable, 3000);        }else {            tv_check_connection.setVisibility(View.VISIBLE);            tv_check_connection.setText("Could not Connect to internet");            tv_check_connection.setBackgroundColor(Color.RED);            tv_check_connection.setTextColor(Color.WHITE);        }    }    private void registerNetworkBroadcastForNougat() {        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {            registerReceiver(mNetworkReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));        }        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {            registerReceiver(mNetworkReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));        }    }    protected void unregisterNetworkChanges() {        try {            unregisterReceiver(mNetworkReceiver);        } catch (IllegalArgumentException e) {            e.printStackTrace();        }    }    @Override    public void onDestroy() {        super.onDestroy();        unregisterNetworkChanges();    }}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.keshav.networkchangereceiverexample.MainActivity">    <TextView        android:id="@+id/tv_check_connection"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="Connection establised !"        android:padding="25dp"        app:layout_constraintBottom_toBottomOf="parent"        android:gravity="center"        app:layout_constraintLeft_toLeftOf="parent"        app:layout_constraintRight_toRightOf="parent"        app:layout_constraintTop_toTopOf="parent" /></LinearLayout>