应用启动时,Android 6和Android 7的网络连接检查不同

时间:2018-05-31 19:12:11

标签: android android-networking android-connectivitymanager

我的应用是自助服务终端模式应用(除非用户输入代码,否则他无法访问任何Android应用)。因此,当选项卡启动时,有一些设置要在服务中完成。 我使用以下代码来检查网络连接(此代码在我的工作中被重用为实用程序类的一部分)。如果有可用的网络,我需要执行一个命令,否则必须触发一个事件。



ConnectivityManager connectivityManager 
          = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null && activeNetworkInfo.isConnected();




在Android 7中,此代码完美无瑕。在启动时,由于存在SIM和网络连接,我可以执行命令。

但在Android 6中,即使有网络可用性,代码也始终返回未连接/ OFFLINE。这在设备启动时发生。但是,应用程序启动后连接返回true。

在内部,connectivityManager.activeNetworkInfo基于具有IntentFilter ConnectivityManager.CONNECTIVITY_ACTION的BroadcastReceiver。从日志中,我可以看到CONNECTIVITY_ACTION正在应用程序安装期间注册,但在设备启动时不会发生这种情况。

我尝试对扩展应用程序的类进行网络连接检查但是也没有工作 - 认为检查会让应用程序在启动时意识到存在网络连接。

1 个答案:

答案 0 :(得分:1)

正确等待网络连接:

  1. 使用启动接收器在启动时启动自助服务终端活动。
  2. 当应用启动时,请在您的活动中以编程方式在应用中注册您的接收器。不要在清单中注册。 CONNECTIVITY_ACTION的清单注册接收者已弃用。如果您的目标是API 22+,则可以使用ConnectivityManager.requestNetwork()进行回调而不是广播(此处未说明)。
  3. registerReceiver()的返回值是一个意图,它是网络的当前状态(CONNECTIVITY_ACTION是粘性广播)。采取行动。如果意图有一个额外的EXTRA_NO_CONNECTIVITY,那么就没有网络连接,你的应用必须等到接收器被触发,然后再次检查连接。
  4. 请记住,连接可以随时上下移动,因此您的接收器需要触发UI中的更改才能达到此效果。
  5. 不同的设备和不同版本的Android以及不同的网络类型(包括不同的SIM卡)可能会导致网络接口何时连接出现不同的延迟。它绝对与您的应用程序启动或启动等无关。当您致电getActiveNetworkInfo()时,它只是一个对系统服务器执行IPC以获取实际价值的存根。你的过程中没有逻辑运行或状态。