Dynamic BroadcastReceiver to Check Online Connectivity

房东的猫 提交于 2020-01-24 21:57:09

问题


I want to dynamically set up a BroadcastReceiver to check whether or not I am online ONLY when my app is running in the foreground. Within my main class, I created an an Intent Filter, a nested BroadcastReceiver Class and finally register/unregister the receiver within the onResume and onPause methods respectively.

My question is, is there an an intent ACTION that I can add to my intent filter that checks for online connectivity?

If not, how can I create this Dynamic Broadcast Receiver to perform only when my app is running?

Here is what my Class looks like....

public class MainActivity extends AppCompatActivity {
private IntentFilter onlineIntentFilter;
private CheckOnlineReceiver checkOnlineReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    onlineIntentFilter = new IntentFilter();
    checkOnlineReceiver = new CheckOnlineReceiver();
    //*****WHAT INTENT ACTION CAN I PASS TO CHECK NETWORK CONNECTIVITY******
    onlineIntentFilter.addAction(Intent.ACTION_POWER_DISCONNECTED);

    }

@Override
protected void onResume() {
    super.onResume();
    registerReceiver(checkOnlineReceiver, onlineIntentFilter);
}

@Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(checkOnlineReceiver);
}


private class CheckOnlineReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        Toast.makeText(getApplicationContext(),"IN METHOD, ACTION = " + action, Toast.LENGTH_LONG).show();
    }
}}

回答1:


Add connectivity action onlineIntentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION)

and don't forget to add the permission

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

The broadcast receiver's onReceive() will be called on connectivity change which means on both connected and disconnected. so whenever you receive the braodcast you have check for connectivity as below

public boolean isNetworkAvailable() {
  ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
  NetworkInfo networkInfo = cm.getActiveNetworkInfo();
  if (networkInfo != null && networkInfo.isConnected()) {
      return true;
  }
  return false;
}



回答2:


Here is the standard way to do this.

Create a interface which will have two methods onNetworkConnected() and onNetworkDisconnected()

public interface NetworkConnectivityListener {
     public void onNetworkConnected();
     public void onNetworkDisconnected();
}

Any class that wants to listen to network changes will implement this interface and override it's two methods.

Create a class which will extend the BroadcastReceiver and this receiver's onReceive() will catch the connectivity changes. In this class create a function to register the listeners

public class NetworkBroadcastReceiver extends BroadcastReceiver {

private NetworkConnectivityListener listener;

public NetworkBroadcastReceiver(NetworkConnectivityListener listener) {
    this.listener = listener;
}

@Override
public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();

    if (listener != null) {
        if (isConnectedToInternet()) {
            listener.onNetworkConnected();
        } else {
            listener.onNetworkDisconnected();
        }
    } 
}

PS you can easily check if your device is connected to internet or not. Just google.

Now let's say you want your MainActivity to listen to netwrork changes, all you have to do is implement the NetworkConnectivityListener in your main activity call and create an instance of the NetworkBroadcastReceiver passing the context of MainActivity and it will start to get the network updates.




回答3:


add intentfilter CONNECTIVITY_ACTION




回答4:


You will need to create a service as you are looking to perform a long-running task in the background.

A service will need to be registered in the manifest, within the <application> tags.

<service android:name=".WifiService"
         android:stopWithTask="true"
         android:enabled="true"/>

stopWithTask causes the service to be destroyed when all of your activities are destroyed (the default value is true).

You will need to register and unregister a BroadcastReceiver to the CONNECTIVITY_CHANGE action in the service class.

public class WifiService extends Service {

    private BroadcastReceiver mReceiver;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        IntentFilter filter = new IntentFilter();
        filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");

        // Your BroadcastReceiver class
        mReceiver = new WifiReceiver();
        registerReceiver(mReceiver, filter);
        return null;
    }

    @Override
    public boolean onUnbind(Intent intent) {
        unregisterReceiver(mReceiver);
        return super.onUnbind(intent);
    }
}

And then in the BroadcastReceiver you must listen for CONNECTIVITY_CHANGE.

public class WifiReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = manager.getActiveNetworkInfo();

        boolean isConnected = networkInfo != null &&
                              networkInfo.isConnectedOrConnecting();

        if (isConnected) {
            switch (networkInfo.getType()) {
                case ConnectivityManager.TYPE_WIFI:
                    // Connected via wifi
                    break;

                case ConnectivityManager.TYPE_ETHERNET:
                    // Connected via ethernet
                    break;

                case ConnectivityManager.TYPE_MOBILE:
                    // Connected via mobile data
                    break;
            }
        }
    }
}

With this setup you will be able to notify components of your application on connectivity change.



来源:https://stackoverflow.com/questions/42315539/dynamic-broadcastreceiver-to-check-online-connectivity

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!