有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java安卓:互联网连接变化监听器

我已经有了监听连接更改的代码-

public class NetworkStateReceiver extends BroadcastReceiver
{
  public void onReceive(Context context, Intent intent)
  {
    Log.d("app","Network connectivity change");

    if(intent.getExtras() != null)
    {
      NetworkInfo ni = (NetworkInfo) intent.getExtras().get(ConnectivityManager.EXTRA_NETWORK_INFO);
      if(ni != null && ni.getState() == NetworkInfo.State.CONNECTED)
      {
        Log.i("app", "Network " + ni.getTypeName() + " connected");
      }
    }

    if(intent.getExtras().getBoolean(ConnectivityManager.EXTRA_NO_CONNECTIVITY, Boolean.FALSE))
    {
      Log.d("app", "There's no network connectivity");
    }
  }
}

我使用以下代码检查Internet连接-Internet Check

但问题是,如果网络突然失去互联网连接而没有任何连接改变,那么这段代码是无用的。有没有办法创建广播接收器侦听器以更改Internet连接?我有一个web应用程序,突然的互联网连接变化可能会导致问题


共 (6) 个答案

  1. # 1 楼答案

    试试这个

    public class NetworkUtil {
        public static final int TYPE_WIFI = 1;
        public static final int TYPE_MOBILE = 2;
        public static final int TYPE_NOT_CONNECTED = 0;
        public static final int NETWORK_STATUS_NOT_CONNECTED = 0;
        public static final int NETWORK_STATUS_WIFI = 1;
        public static final int NETWORK_STATUS_MOBILE = 2;
    
        public static int getConnectivityStatus(Context context) {
            ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    
            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
            if (null != activeNetwork) {
                if(activeNetwork.getType() == ConnectivityManager.TYPE_WIFI)
                    return TYPE_WIFI;
    
                if(activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE)
                    return TYPE_MOBILE;
            } 
            return TYPE_NOT_CONNECTED;
        }
    
        public static int getConnectivityStatusString(Context context) {
            int conn = NetworkUtil.getConnectivityStatus(context);
            int status = 0;
            if (conn == NetworkUtil.TYPE_WIFI) {
                status = NETWORK_STATUS_WIFI;
            } else if (conn == NetworkUtil.TYPE_MOBILE) {
                status = NETWORK_STATUS_MOBILE;
            } else if (conn == NetworkUtil.TYPE_NOT_CONNECTED) {
                status = NETWORK_STATUS_NOT_CONNECTED;
            }
            return status;
        }
    }
    

    还有广播接收机

    public class NetworkChangeReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(final Context context, final Intent intent) {
    
            int status = NetworkUtil.getConnectivityStatusString(context);
            Log.e("Sulod sa network reciever", "Sulod sa network reciever");
            if ("android.net.conn.CONNECTIVITY_CHANGE".equals(intent.getAction())) {
                if (status == NetworkUtil.NETWORK_STATUS_NOT_CONNECTED) {
                    new ForceExitPause(context).execute();
                } else {
                    new ResumeForceExitPause(context).execute();
                }
           }
        }
    }
    

    别忘了把这个放进你的AndroidManifest里。xml

     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     <uses-permission android:name="android.permission.INTERNET" />
     <receiver
            android:name="NetworkChangeReceiver"
            android:label="NetworkChangeReceiver" >
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
            </intent-filter>
        </receiver>
    

    希望这能帮你干杯

  2. # 2 楼答案

    下面是使用registerDefaultNetworkCallback(和registerNetworkCallbackfor API<;24)的Java代码:

    ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
        @Override
        public void onAvailable(Network network) {
            // network available
        }
    
        @Override
        public void onLost(Network network) {
            // network unavailable
        }
    };
    
    ConnectivityManager connectivityManager =
            (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        connectivityManager.registerDefaultNetworkCallback(networkCallback);
    } else {
        NetworkRequest request = new NetworkRequest.Builder()
                .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET).build();
        connectivityManager.registerNetworkCallback(request, networkCallback);
    }
    
  3. # 3 楼答案

    在api 28+中,ConnectivityAction是deprecated。相反,只要支持api 24+,就可以使用registerDefaultNetworkCallback

    在科特林:

    val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    connectivityManager?.let {
        it.registerDefaultNetworkCallback(object : ConnectivityManager.NetworkCallback() {
            override fun onAvailable(network: Network) {
                //take action when network connection is gained
            }
            override fun onLost(network: Network?) {
                //take action when network connection is lost
            }
        })
    }
    
  4. # 4 楼答案

    这应该是有效的:

    public class ConnectivityChangeActivity extends Activity {
    
        private BroadcastReceiver networkChangeReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                Log.d("app","Network connectivity change");
            }
        };
    
        @Override
        protected void onResume() {
            super.onResume();
    
            IntentFilter intentFilter = new IntentFilter();
            intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
            registerReceiver(networkChangeReceiver, intentFilter);
        }
    
        @Override
        protected void onPause() {
            super.onPause();
    
            unregisterReceiver(networkChangeReceiver);
        }
    }
    
  5. # 5 楼答案

    我将此方法用作连接侦听器。为Lolipop+工作,Android JAVA语言

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
        ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkRequest networkRequest = new NetworkRequest.Builder().build();
        connectivityManager.registerNetworkCallback(networkRequest, new ConnectivityManager.NetworkCallback() {
            @Override
            public void onAvailable(Network network) {
                super.onAvailable(network);
                Log.i("Tag", "active connection");
            }
    
            @Override
            public void onLost(Network network) {
                super.onLost(network);
                Log.i("Tag", "losing active connection");
                isNetworkConnected();
            }
        });
    }
    
    private boolean isNetworkConnected() {
        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        if (!(cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnected())) {
            //Do something
            return false;
        }
        return true;
    }
    

    并将此权限添加到Android清单中。xml

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
  6. # 6 楼答案

    更新

    Apps targeting Android 7.0 (API level 24) and higher do not receive CONNECTIVITY_ACTION broadcasts if they declare the broadcast receiver in their manifest. Apps will still receive CONNECTIVITY_ACTION broadcasts if they register their BroadcastReceiver with Context.registerReceiver() and that context is still valid.

    您需要通过registerReceiver()方法注册接收器:

     IntentFilter intentFilter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
     mCtx.registerReceiver(new NetworkBroadcastReceiver(), intentFilter);