I\'m using this code to be notified when the connection is lost in API 20 and down.
registerReceiver(getConnectivityStateBroadcastReceiver(), new IntentFilte
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