0

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

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

在 Android 7 中,此代码可以完美运行。启动时,由于有 SIM 并且网络连接可用,我可以执行命令。

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

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

我试图对扩展 Application 的类进行网络连接检查,但这也不起作用 - 认为检查将使应用程序在启动时意识到存在网络连接。

4

1 回答 1

1

正确等待网络连接:

  1. 使用启动接收器在启动时启动您的信息亭活动。
  2. 当应用程序启动时,在应用程序中以编程方式在您的活动中注册您的接收器。不要在清单中注册它。清单注册的接收器已CONNECTIVITY_ACTION被弃用。如果您的目标是 API 22+,则可以使用ConnectivityManager.requestNetwork()回调而不是广播(此处未描述)。
  3. 的返回值registerReceiver()是一个意图,它是网络的当前状态(CONNECTIVITY_ACTION是一个粘性广播)。对此采取行动。如果 Intent 有额外EXTRA_NO_CONNECTIVITY的,则没有网络连接,您的应用必须等到接收器被触发,然后再次检查连接。
  4. 请记住,连接可以随时上升和下降,因此您的接收器需要触发 UI 中的更改以达到此效果。

不同的设备和不同版本的 Android 以及不同的网络类型(包括不同的 SIM 卡)可能会导致网络接口何时连接的不同延迟。它绝对与您的应用程序启动或已启动等无关。当您调用时getActiveNetworkInfo(),它只是一个对系统服务器执行 IPC 以获得真正价值的存根。您的流程中没有运行逻辑或保留状态。

于 2018-05-31T20:54:56.490 回答