如何检查设备是否与互联网断开连接?

时间:2019-03-18 11:16:19

标签: android connection android-connectivitymanager

我找到了有关检查设备是否已连接到互联网的代码。代码如下

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

我的问题是,如果返回 TRUE 但设备突然失去连接,该怎么办?如何在运行应用程序时收到信号,通知我 ANY 已经失去了互联网连接?

1 个答案:

答案 0 :(得分:0)

您可以在N以下实现应用内定位。

在AndroidManifest.xml中,您必须添加以下权限。

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

这是清单文件中的收款人。

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

这里是广播接收者

public class NetworkStateReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

    if(isDeviceOnline()){

      }    
}


private boolean isDeviceOnline() {
        ConnectivityManager connMgr =
                (ConnectivityManager) Collect.getInstance().getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
        return networkInfo != null && networkInfo.isConnected();
    }

但是,针对N或更高版本的应用,不建议为android.net.conn.CONNECTIVITY_CHANGE声明广播接收器。

通常,应用程序不应依赖此广播,而应使用JobScheduler或GCMNetworkManager。

此问题标记的代码*负面影响电池寿命,或*使用最近更改了行为的API,以防止后台任务过度消耗内存和电池。
通常,您应该改用JobScheduler或GcmNetworkManager。
有关如何更新代码的更多详细信息,

More info

安排非计量连接上的网络作业

使用JobInfo.Builder类构建JobInfo对象时,请应用setRequiredNetworkType()方法,并将JobInfo.NETWORK_TYPE_UNMETERED作为作业参数传递。以下代码示例调度了当设备连接到未测量的网络并正在充电时运行的服务:

public static final int MY_BACKGROUND_JOB = 0;
...
public static void scheduleJob(Context context) {
  JobScheduler js =
      (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
  JobInfo job = new JobInfo.Builder(
    MY_BACKGROUND_JOB,
    new ComponentName(context, MyJobService.class))
      .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
      .setRequiresCharging(true)
      .build();
  js.schedule(job);
}

Find more detail here