Я написал NetworkStateReceiver для проверки состояния Интернета и публикации этого намерения в Activity через Event Bus.
public class NetworkStateReceiver extends BroadcastReceiver {
private static final String TAG = "NetworkStateReceiver";
NetworkEvent networkEvent = null;
@Override
public void onReceive(final Context context, final Intent intent) {
LogMe.e(TAG, "Network connectivity change");
if (intent.getExtras() != null && intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
if (Connectivity.isConnected(context)) {
LogMe.i(TAG, "Network " + Connectivity.getNetworkInfo(context) + " connected");
networkEvent = new NetworkEvent(NetworkEvent.INTERNET_CONNECTED, true);
EventBus.getDefault().post(networkEvent);
} else {
LogMe.i(TAG, "Network " + Connectivity.getNetworkInfo(context) + " not connected");
networkEvent = new NetworkEvent(NetworkEvent.INTERNET_GONE, false);
EventBus.getDefault().post(networkEvent);
}
}
}
}
В действии я зарегистрировал шину событий onStart и отменил регистрацию в onPause.
@Override
protected void onResume() {
super.onResume();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
broadcastReceiver = new NetworkStateReceiverActivity();
registerReceiver(broadcastReceiver, intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
protected void onPause() {
super.onPause();
EventBus.getDefault().unregister(this);
unregisterReceiver(broadcastReceiver);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onNetworkEvent(NetworkEvent event) {
textView_internet.setText("" + event.isNetworkStateChanged());
if (event.getTAG() == NetworkEvent.INTERNET_CONNECTED) {
if (event.isNetworkStateChanged()) {
LogMe.i(TAG, "Has Internet ....");
Snackbar.make(getWindow().getDecorView().getRootView(), "Has internet ", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
} else if (event.getTAG() == NetworkEvent.INTERNET_GONE) {
if (!event.isNetworkStateChanged()) {
LogMe.i(TAG, "No Internet ....");
Snackbar.make(getWindow().getDecorView().getRootView(), "No internet", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
}
}
Но проблема в том, что Eventbus вызывается все время через инет, подключен он или нет. Я хочу вызвать Eventbus, когда пользователь изменил состояние сети не все время, когда создается действие. Как избавиться от этого? Я также тестировал только с широковещательным приемником в действии, но вещание получалось каждый раз, когда создавалось действие.