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

后端 未结 3 1188
滥情空心
滥情空心 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条回答
  •  旧时难觅i
    2020-12-24 08:36

    I'll paste my complete solution since I needed to look into many places in order to make it work:

    In Application class

    public void onCreate(){
    ...
    
    IntentFilter filter = new IntentFilter();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            Timber.d("using registerNetworkCallback");
            createChangeConnectivityMonitor();
            filter.addAction(MY_CONNECTIVITY_CHANGE);
        } else {
            Timber.d("using old broadcast receiver");
            filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        }
    
        registerReceiver(new SyncOnConnectivityReceiver(), filter);
     }
    
      @RequiresApi(Build.VERSION_CODES.N)
       private void createChangeConnectivityMonitor() {
        final Intent intent = new Intent(MY_CONNECTIVITY_CHANGE);
        ConnectivityManager connectivityManager = (ConnectivityManager) 
      getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivityManager != null) {
            connectivityManager.registerNetworkCallback(
                   new NetworkRequest.Builder().build(), 
                   new ConnectivityManager.NetworkCallback() {
                        /**
                         * @param network
                         */
                        @Override
                        public void onAvailable(Network network) {
                            Timber.d("On available network");
                            sendBroadcast(intent);
                        }
    
                        /**
                         * @param network
                         */
                        @Override
                        public void onLost(Network network) {
                            Timber.d("On not available network");
                            sendBroadcast(intent);
                        }
                    });
        }
    
    }
    

    In my receiver:

    public class SyncOnConnectivityReceiver extends BroadcastReceiver {
    
    @Override
     public void onReceive(@Nullable final Context context, Intent intent) {
        Timber.d("triggering on connectivity change");
        if (context != null && isNetworkAvailable(context)) {
            Executors.newSingleThreadExecutor().submit(new Runnable() {
                @Override
                public void run() {
                    syncBusData(context);
                }
            });
        }
    }
    
    private boolean isNetworkAvailable(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (cm != null) {
            NetworkInfo networkInfo = cm.getActiveNetworkInfo();
            return networkInfo != null && networkInfo.isConnected();
        }
        return false;
    }
    
    private void syncData(Context context) {
    
    }
    }
    

    In AndroidManifiest.xml

    
    
    
    
    

提交回复
热议问题