使用Android O上网时安排作业

时间:2017-10-16 14:16:35

标签: android android-jobscheduler android-8.0-oreo android-connectivitymanager

这是我想要实现的目标:

  1. 在后台监控网络状态。
  2. 当设备没有互联网时。
  3. 触发工作。
  4. Currently我看到,当设备进入“无互联网”状态时,无法触发工作。任何变通方法或解决方案?

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

1 个答案:

答案 0 :(得分:0)

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

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 互联网连接的代码,如果连接不起作用,则会调用您的方法。另请注意,Handler代码将放在方法中,isOnline()是一种方法。

在此处工作是突出显示的,因为如果没有互联网连接WiFi(基本上是没有互联网的热点),检查互联网连接的最常见方式实际上返回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" />

的权限

使用它,它会很好用。

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

编辑 -

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

这可用于确定网络状态更改。 默认状态为:

DATA_DISCONNECTED
DATA_CONNECTING
DATA_CONNECTED
DATA_SUSPENDED