0

这是我想要实现的目标:

  1. 在后台监控网络状态。
  2. 当设备没有互联网时。
  3. 触发作业。

目前我看到,当设备进入“无互联网”状态时,不可能触发作业。任何解决方法或解决方案?

注意:我不喜欢通过前台服务监控设备互联网连接。

4

1 回答 1

0

这是您可以在任何地方使用的内容,但请记住它应该至少启动一次,这意味着要么将其放入一个方法中,要么将其放入onCreate一个方法中,然后至少调用该方法一次。

Handler handler = new Handler();
int timeDelay = 5000;     //5 seconds
handler.postDelayed(new Runnable(){
    public void run(){
        if(!isOnline)
         {
           yourMethodCall();
         }            
        handler.postDelayed(this, timeDelay );
    }
}, delay);

public boolean isOnline() throws InterruptedException, IOException {
        String command = "ping -c 1 google.com";
        return (Runtime.getRuntime().exec(command).waitFor() == 0);
    }

这是每 5 秒检查一次WORKING Internet 连接的代码,如果连接不工作,那么它将在其中调用您的方法。另外,请注意 Handler 代码将放在一个方法中,而 isOnline() 是一个方法。

突出显示此处的工作是因为如果 WiFi 在没有 Internet 的情况下连接(基本上是没有 Internet 的热点),则检查 Internet 连接的最常见方法实际上返回 true。但由于您只想检查是否没有连接,您也可以使用此代码。

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

但是如果使用这种方式,您必须在 AndroidManifest.XML 中声明一个权限,即<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

使用它,它会很好用。

是的,它将在后台运行。在我的应用程序中不是问题,但一些用户报告说isOnline(),使用 ping 检查连接的方法有时会在 5 秒内未收到 ping 的情况下冻结线程。因此,如果您遇到这种情况,您必须使用 isNetworkAvailable() 方法,直到那时isOnline()更好。

编辑-

在查看Android References时,我发现了这个: void onDataConnectionStateChanged (int state)

这可用于确定网络状态变化。默认状态为:

DATA_DISCONNECTED
DATA_CONNECTING
DATA_CONNECTED
DATA_SUSPENDED
于 2017-10-16T16:32:11.417 回答