How can I receive a notification when the device loses network connectivity in android L (API 21)

后端 未结 3 1184
滥情空心
滥情空心 2020-12-24 07:53

I\'m using this code to be notified when the connection is lost in API 20 and down.

registerReceiver(getConnectivityStateBroadcastReceiver(), new IntentFilte         


        
3条回答
  •  無奈伤痛
    2020-12-24 08:48

    Try this if you need

    • register to the network state changes
    • consider all network interfaces
    • want to be notified if network is available for any interface
    • that code supports API>20 (you can add also legacy API support easily)

    Declare the necessary variables in your class:

    private static final HashMap mNetworkStates = new HashMap<>();
    private final Object mSyncNetworkState = new Object();
    private Boolean mNetworkState;
    

    Define your method which monitors the interface changes. mNetworkState shows always if at least one network interface is connected.

    private void registerNetworkStateInfo(@NonNull final Context context) throws Exception {
        final ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkRequest.Builder builder = new NetworkRequest.Builder();
    
        if (connectivityManager != null) {
            connectivityManager.registerNetworkCallback(
                    builder.build(),
                    new ConnectivityManager.NetworkCallback() {
                        @Override
                        public void onAvailable(@NonNull Network network) {
                            mNetworkStates.put(network, true);
                            synchronized (mSyncNetworkState){
                                mNetworkState = true;
                            }
    
                            Log.d("Network state", "Network state: true");
                        }
    
                        @Override
                        public void onLost(@NonNull Network network) {
                            mNetworkStates.put(network, false);
                            synchronized (mSyncNetworkState){
                                mNetworkState = false;
                                Log.d("Network state", "Network state: false");
    
                                mNetworkStates.forEach(new BiConsumer() {
                                    @Override
                                    public void accept(Network nextNetwork, Boolean state) {
                                        if (state.equals(true)) {
                                            mNetworkState= true;
                                            Log.d("Network state", "Network state: but true");
                                        }
                                    }
                                });
                            }
                        }
                    }
            );
        } else {
            synchronized (mSyncNetworkState){
                mNetworkState = false;
            }
            throw new Exception("Connectivity Manager is not available");
        }
    }
    

    Use your mNetworkState

    synchronized (mSyncNetworkState){
        if (!mNetworkState) {
            throw new Exception("No network available");
        }
    }
    

提交回复
热议问题