当应用程序运行时如何连续检查互联网连接

6
我已经写出了检查网络连接的代码,但我希望它在后台保持检查网络连接并在连接丢失时通知用户。 我刚开始学习Android,你能否为我编写正确的代码并帮助我。 这段代码可以正常运行,我只想让它在后台运行以保持对互联网的监测。
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;

        }
    }

1
检查网络连接的广播接收器 - RonTLV
可能是重复的问题:Android网络连接状态变化的事件 - Manohar
8个回答

3

使用 ReactiveNetwork 库。

ReactiveNetwork 是一个监听网络连接状态和互联网连接的 Android 库。该库支持新旧网络监控策略。Min SDK 版本为 9。

用法:

将以下内容添加到 gradle:

implementation 'com.github.pwittchen:reactivenetwork-rx2:3.0.2'

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 持续观察互联网连接状态

更多信息请查看链接


ConnectionQuality.EXCELLENT是什么?你如何定义它? - olajide
这只是一个具有两个值的“枚举”(enum)。 - Basi

1

https://dev59.com/rVoV5IYBdhLWcg3wTdTN#52718543

请查看这个答案。我已经成功测试过并且它也支持旧版本的Android。虽然它无法检测连接是否有互联网访问,但如果您只想检测设备是否连接到蜂窝网络或WiFi,则可以使用它。
我甚至使用它制作了一个简单的库。 connectednot connected

1
使用广播接收器创建类文件,并将其在AndroidManifest.xml中注册为接收器并扩展BroadcastReceiver类。

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>

在onReceive()方法中,使用以下方法检查互联网连接。

public boolean isOnline(Context context) {

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

1
步骤1. 将JitPack存储库添加到您的构建文件中,在根build.gradle文件末尾添加它到存储库中。
allprojects {
      repositories {
        ...
        maven { url 'https://jitpack.io' }
      }
    }

步骤2. 添加依赖。
dependencies {
            implementation 'com.github.SumonHub:EagleEye:1.0.0'
    }

待办事项
启用EagleEye
如果您没有覆盖Application类,请编辑清单文件并按如下方式设置android:name标签:

<?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>

如果您要覆盖Application类,请按以下方式将其更改为扩展EagleEyeApplication(如果可能):
public class MyApplication extends EagleEyeApplication { ... }

在您的活动/片段中,获取如下状态:
EagleEyeObserver.setConnectivityListener(new OnChangeConnectivityListener() {
    @Override
    public void onChanged(boolean status) {
        Toast.makeText(MainActivity.this, "" + status, Toast.LENGTH_SHORT).show();
    }
});

更多信息 这里


1

Java文件,这将在应用程序启动时检查互联网连接

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();
        }
    }

上述Java代码的布局文件。
<?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>

只需添加这行代码,就可以持续检查网络连接

 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>

将此文件放置在名为“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>

你需要输入以上所有代码才能使其正常工作。希望这能帮到你。


0

0
你可以使用 ScheduledExecutorService 在后台线程上定期安排操作发生。 每秒钟检查一次:
public boolean isInternetAvailable() {
    try {
        InetAddress ipAddr = 
 InetAddress.getByName("google.com");
            return !ipAddr.equals("");
        } catch (Exception e) {
            return false;
    }
}

例如:

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

启动一个服务并执行此操作。


请告诉我如何做,帮帮我。 - anshul raj
https://developer.android.com/reference/java/util/concurrent/ScheduledExecutorService - Amirhosein

0
尝试这样做:将此代码添加到OnCreate()中。
 /*--Check Connectivity--*/
        getApplicationContext().registerReceiver(mConnReceiver,
                new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));

调用此方法

   /*--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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接