这可能不是最有效的方法,但在这种情况下它符合我的目的。我正在使用 ping 服务(目前为 8.8.8.8)、JS 回调和 ConnectivityManager NetworkCallback 来实现这一点。
我们正在使用 JS 来检查是否所有资源都加载了,它会给出错误,'no' 或'yes'。 Error & 'no' 表示 html 没有完全加载。
ConnectivityManager NetworkCallback 用于在用户处于设置屏幕时了解同一 WiFi 的互联网何时恢复,因为如果互联网恢复,我们需要将用户重定向回应用程序。在这种情况下会调用onLinkPropertiesChanged,我们会使用 Ping 服务检查互联网是否可用。
注册 NetworkCallback
connectivityManager =
(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder builder = new NetworkRequest.Builder();
builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
builder.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
builder.addTransportType(NetworkCapabilities.TRANSPORT_VPN);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
connectivityManager.registerNetworkCallback(builder.build(), networkCallback);
}
networkCallback
ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onAvailable(Network network) {
// network available
networkCheck(network);
}
@Override
public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) {
super.onLinkPropertiesChanged(network, linkProperties);
networkCheck(network);
}
@Override
public void onLost(Network network) {
// network unavailable
onDisconnected();
}
};
networkCheck 检查互联网是否可用。也许这一步可以忽略,虽然写我 NET_CAPABILITY_VALIDATED 会检查互联网。但在某些情况下它会失败。
private void networkCheck(Network network) {
ConnectivityManager cm = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getNetworkInfo(network);
boolean isConnected = (info != null && info.isConnectedOrConnecting());
if (!isConnected) {
onDisconnected();
return;
}
NetworkCapabilities nc = cm.getNetworkCapabilities(network);
if (nc == null || !nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) || !checkPingService()) {
onDisconnected();
return;
}
onConnected();
}
checkPingService 检查互联网是否可用
private boolean checkPingService() {
try {
Process p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 8.8.8.8");
int returnVal = p1.waitFor();
return (returnVal == 0);
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
这在我们迄今为止测试的所有场景中都有效。因此,如有任何疑问,请随时发表评论。