【问题标题】:How to check if device got disconnected from the Internet?如何检查设备是否与互联网断开连接?
【发布时间】:2023-03-19 15:34:02
【问题描述】:

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

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

我的问题是,如果返回 TRUE 但设备突然失去连接怎么办?当我的应用程序运行时,如何获得一个信号,让我知道我在任何点失去了互联网连接?

【问题讨论】:

标签: android connection android-connectivitymanager


【解决方案1】:

您可以实现低于 N 的应用内定位。

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

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

这是你在 manfest 文件中的接收器。

<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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 2012-05-18
    相关资源
    最近更新 更多