6

I have created code which checks the internet connection at the start but I want it to keep checking for internet connection in the background and notify the user when connection is lost. I'm new to android so can you please write proper code and help me. This code works fine, I just want it so that it runs in the background to keep a check on internet.

public class isNetworkAvailable extends Activity  {
    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_is_network);
       ;
            if(!isNetworkAvailable()){
                //Create an alert dialog
                AlertDialog.Builder Checkbuilder = new  AlertDialog.Builder(isNetworkAvailable.this);
                Checkbuilder.setIcon(R.drawable.error);
                Checkbuilder.setTitle("Error!");
                Checkbuilder.setMessage("Check Your Internet Connection.");
                //Builder Retry Button

                Checkbuilder.setPositiveButton("Retry", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int id) {
                        //Restart The Activity
                        Intent intent = getIntent();
                        finish();
                        startActivity(intent);

                    }
                });

                Checkbuilder.setNegativeButton("Exit", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        finish();
                    }
                }) ;

                AlertDialog alert=Checkbuilder.create();
                alert.show();

            }



            else {
                if (isNetworkAvailable()){

                    Thread tr=new Thread(){
                        public  void  run(){
                            try {
                                sleep(4);
                            }
                            catch (Exception e){
                                e.printStackTrace();
                            }
                            finally {
                                Intent i = new Intent(isNetworkAvailable.this,MainActivity.class);
                                startActivity(i);

                                finish();
                            }}};tr.start();}}}private boolean isNetworkAvailable(){
            ConnectivityManager connectivityManager=(ConnectivityManager)this.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo activeNetworkInfo=connectivityManager.getActiveNetworkInfo();
            return activeNetworkInfo !=null;

        }
    }
Ryan Godlonton-Shaw
  • 584
  • 1
  • 5
  • 18
anshul raj
  • 173
  • 2
  • 17
  • 1
    [Broadcast receiver for checking internet connection](https://stackoverflow.com/questions/15698790/broadcast-receiver-for-checking-internet-connection-in-android-app) – RonTLV Apr 01 '19 at 07:53
  • Possible duplicate of [Android event for internet connectivity state change](https://stackoverflow.com/questions/6169059/android-event-for-internet-connectivity-state-change) – Manohar Apr 01 '19 at 08:29

8 Answers8

3

Use ReactiveNetwork lib

ReactiveNetwork is an Android library listening network connection state and Internet connectivity. Library supports both new and legacy network monitoring strategies. Min SDK version = 9

Usage

add this to gradle

dependencies {
  implementation 'com.github.pwittchen:reactivenetwork-rx2:3.0.2'
}

and in your activity

ReactiveNetwork.observeInternetConnectivity()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(isConnectedToInternet -> {
                    // do something with isConnectedToInternet value

                    changeOnlineStatus(isConnectedToInternet ? ConnectionQuality.EXCELLENT : ConnectionQuality.POOR);
                });

it Observe Internet connectivity continuously

for more info link

Basi
  • 3,009
  • 23
  • 28
1

Use BroadCast Receiver Create Class file and register this in AndroidManifest.xml as receiver and extends BroadcastReceiver Class.

AndroidManifest.xml

<receiver android:name=".CheckConnection" >
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
        <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
    </intent-filter>
</receiver>

And in onReceive() method use below mathod to check internet connection.

public boolean isOnline(Context context) {

    ConnectivityManager cMan = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo nInfo = cMan.getActiveNetworkInfo();
    return (nInfo != null && nInfo.isConnected());
}
1

java file this will check for internet when app is start running

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;

public class isNetworkAvailable extends Activity {
    private ImageButton btn;
private Handler h = new Handler();
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_is_network);
            btn = (ImageButton) findViewById(R.id.bu);
   btn.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View v) {
                     restar();
       }
   });
                    if (!isNetworkAvailable()) {
                        //Create an alert dialog


                        AlertDialog.Builder Checkbuilder = new AlertDialog.Builder(isNetworkAvailable.this);
                        Checkbuilder.setIcon(R.drawable.error);
                        Checkbuilder.setTitle("Error!");
                        Checkbuilder.setMessage("Check Your Internet Connection.");
                        //Builder Retry Button

                        Checkbuilder.setPositiveButton("Retry", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int id) {
                                //Restart The Activity
                                Intent intent = getIntent();
                                finish();
                                startActivity(intent);

                            }
                        });


                Checkbuilder.setNegativeButton("Exit", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        finish();
                    }
                });

                AlertDialog alert = Checkbuilder.create();
                alert.show();

            } else {
                if (isNetworkAvailable()) {

                    Thread tr = new Thread() {
                        public void run() {
                            try {
                                sleep(4);
                            } catch (Exception e) {
                                e.printStackTrace();
                            } finally {
                                Intent i = new Intent(isNetworkAvailable.this, MainActivity.class);
                                startActivity(i);

                                finish();
                            }
                        }
                    };
                    tr.start();

                }
            }

        }


        private boolean isNetworkAvailable() {
            ConnectivityManager connectivityManager = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
            return activeNetworkInfo != null;

        }

public  void restar(){

            Intent intenet =new Intent(this,isNetworkAvailable.class);

                    startActivity(intenet);
                    finish();
        }
    }

layout file for above java code

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
    android:background="@android:color/white"
    tools:context=".isNetworkAvailable">


    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="389dp"
        android:layout_height="439dp"
        android:contentDescription="no internet check your connection"
        android:src="@raw/no"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.4"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <ImageButton
        android:id="@+id/bu"
        android:layout_width="335dp"
        android:layout_height="80dp"
        android:layout_below="@id/imageView2"
        android:layout_marginTop="32dp"
        android:contentDescription="Tap to retry"

        android:src="@raw/r"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/imageView2" />
</android.support.constraint.ConstraintLayout>

and just add this line of code will check internet connection continuously

 mWebView.setWebViewClient(new WebViewClient() {
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {

                mWebView.loadUrl("file:///android_asset/error.html");

and your android mainfest should be like this

<application
        android:icon="@mipmap/ic_app"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_app_round"
        android:supportsRtl="true"
        android:configChanges="keyboardHidden|orientation|screenSize"
        android:theme="@style/Theme.AppCompat.NoActionBar">
        <activity
            android:name=".isNetworkAvailable"
            android:label="@string/app_name"
            android:theme="@style/Theme.AppCompat.Light.NoActionBar.FullScreen">


            <intent-filter>
                <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <action android:name="android.intent.action.MAIN" />
            </intent-filter>

        </activity>

place this file under assets with name error.html

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="mobile-web-app-capable" content="yes">
    <title>No Connection</title>

    <!-- Stylesheets-->
    <style type="text/css">
 body{
  background: #E1e1e1;
}

#cloud{
  width: 300px;
  height: 120px;
  background: #676767;

  background: -webkit-linear-gradient(-90deg,#676767 5%, #676767 100%);

  -webkit-border-radius: 100px;
  -moz-border-radius: 100px;
  border-radius: 100px;

  position: relative;

  margin: 150px auto 0;
  opacity: .5;
}

#cloud:before, #cloud:after{
  content: '';
  position:absolute;
  background: #676767;
  z-index: -1;
}

#cloud:after{
  width: 100px;
  height: 100px;
  top: -50px;
  left:50px;

  -webkit-border-radius: 100px;
  -moz-border-radius: 100px;
  border-radius: 100px;
}

#cloud:before{
  width: 120px;
  height: 120px;
  top: -70px;
  right: 50px;

  -webkit-border-radius: 200px;
  -moz-border-radius: 200px;
  border-radius: 200px;
}

.shadow {
  width: 300px;
  position: absolute;
  bottom: -10px;
  background: black;
  z-index: -1;

  -webkit-box-shadow: 0 0 25px 8px rgba(0,0,0,0.4);
  -moz-box-shadow: 0 0 25px 8px rgba(0,0,0,0.4);
  box-shadow: 0 0 25px 8px rgba(0,0,0,0.4);

  -webkit-border-radius: 50%;
  -moz-border-radius: 50%;
  border-radius: 50%;

}
h1{
  color: #fff;
  font-size: 25px;
  padding-top: 1px;
  text-align: center ;
  margin: 2px auto;
}

h2 {
  color: #fff;
  font-size: 17px;
  padding-top: 15px;
  text-align: center;
  margin: 5px auto;
}

h4 {
  color: #fff;
  font-size: 14px;
  margin: 0 auto;
  padding: 0;
  text-align: center;
}

 </style>

<body>
<div id="cloud"><h1>Whoops!</h1>
    <h2>Slow or No internet Connection :(</h2>
    <h4>Please Check your WiFi or Mobile Internet!</h4>
    <span class="shadow"></span></div>

</body>
</html>

you need to input all the above code to make it work fine . hope this will help you

anshul raj
  • 173
  • 2
  • 17
1

Step 1. Add the JitPack repository to your build file Add it in your root build.gradle at the end of repositories:

allprojects {
      repositories {
        ...
        maven { url 'https://jitpack.io' }
      }
    }

Step 2. Add the dependency

dependencies {
            implementation 'com.github.SumonHub:EagleEye:1.0.0'
    }

To-do Enable EagleEye If you do not override the Application class, edit your manifest file to set android:name in the tag as follows:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <application
            android:name="org.sumon.eagleeye.EagleEyeApplication" >
        ...
    </application>
</manifest>

If you do override the Application class, change it to extend EagleEyeApplication (if possible) as follows:

public class MyApplication extends EagleEyeApplication { ... }

In youre activity/fragment get status like below

EagleEyeObserver.setConnectivityListener(new OnChangeConnectivityListener() {
    @Override
    public void onChanged(boolean status) {
        Toast.makeText(MainActivity.this, "" + status, Toast.LENGTH_SHORT).show();
    }
});

more info here

SumOn
  • 306
  • 1
  • 4
1

https://stackoverflow.com/a/52718543/8968370

Check out this answer. I've tested it successfully and it supports older android versions too. Though it doesn't detect whether the connection has internet access or not. But you can use it if you simply want to detect whether your device is connected to a cellular or wifi.

I have even made a simple library using that. connectednot connected

KK.s
  • 43
  • 1
  • 8
0

You can use ScheduledExecutorService to schedule an action to occur at regular intervals on a background thread. check every one second:

public boolean isInternetAvailable() {
    try {
        InetAddress ipAddr = 
 InetAddress.getByName("google.com");
            return !ipAddr.equals("");
        } catch (Exception e) {
            return false;
    }
}

Like:

ScheduledExecutorService scheduler =
 Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate
      (new Runnable() {
         public void run() {
            //above method
         }
      }, 0, 1, TimeUnit.SECONDS);

start a service and do this.

Amirhosein
  • 4,266
  • 4
  • 22
  • 35
0

Try This : Add this code in OnCreate()

 /*--Check Connectivity--*/
        getApplicationContext().registerReceiver(mConnReceiver,
                new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));

Call This Method

   /*--Check Connectivity--*/
    private BroadcastReceiver mConnReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
          /*  boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
            String reason = intent.getStringExtra(ConnectivityManager.EXTRA_REASON);
            boolean isFailover = intent.getBooleanExtra(ConnectivityManager.EXTRA_IS_FAILOVER, false);*/

            NetworkInfo currentNetworkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
            //   NetworkInfo otherNetworkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_OTHER_NETWORK_INFO);

            if (currentNetworkInfo.isConnected()) {
                if (check)
                    Snackbar.make(viewPager, "Connected :) ", Snackbar.LENGTH_LONG).show();
            } else {
                //Toast.makeText(WikiSnapActivity.this, "Not Connected", Toast.LENGTH_LONG).show();
                Snackbar.make(viewPager, "No Internet :( ", Snackbar.LENGTH_INDEFINITE).show();
                check = true;
            }
        }
    };
Vivek Makwana
  • 166
  • 3
  • 13
0

You can easily use the library from https://stackoverflow.com/questions/67148762/android-check-internet-connection-after-minsdkversion-21-android-5-0-api-lev/67148896#67148896. With that library no needing to know reactive programming and think about removing observers. Only a few lines of code will provide continuous and safe checking of internet connection.

You can find all necessary instructions at the: https://github.com/vladan29/internet_checker/blob/master/README.md#internet_checker