Network listener Android Network listener Android android android

Network listener Android


New java class:

public class ConnectionChangeReceiver extends BroadcastReceiver{  @Override  public void onReceive( Context context, Intent intent )  {    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService( Context.CONNECTIVITY_SERVICE );    NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();    NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo(     ConnectivityManager.TYPE_MOBILE );    if ( activeNetInfo != null )    {      Toast.makeText( context, "Active Network Type : " + activeNetInfo.getTypeName(), Toast.LENGTH_SHORT ).show();    }    if( mobNetInfo != null )    {      Toast.makeText( context, "Mobile Network Type : " + mobNetInfo.getTypeName(), Toast.LENGTH_SHORT ).show();    }  }}

New xml in your AndroidManifest.xml under the "manifest" element:

<!-- Needed to check when the network connection changes --><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

New xml in your AndroidManifest.xml under the "application" element:

<receiver android:name="com.blackboard.androidtest.receiver.ConnectionChangeReceiver"          android:label="NetworkConnection">  <intent-filter>    <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>  </intent-filter></receiver>


I have been using a small setup to check the bandwidth for determining how to scale things, such as images.

Under the activity, in AndroidManifest:

<intent-filter>...    <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/></intent-filter>

In the activity where the checks are being performed:

boolean network;int bandwidth;@Overridepublic void onCreate(Bundle savedInstanceState) {    ...    network = isDataConnected();    bandwidth = isHighBandwidth();    registerReceiver(new BroadcastReceiver() {        public void onReceive(Context context, Intent intent) {            network = isDataConnected();            bandwidth = isHighBandwidth();        }    }, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"));    ...}...private boolean isDataConnected() {    try {        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);        return cm.getActiveNetworkInfo().isConnectedOrConnecting();    } catch (Exception e) {        return false;    }}private int isHighBandwidth() {    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);    NetworkInfo info = cm.getActiveNetworkInfo();    if (info.getType() == ConnectivityManager.TYPE_WIFI) {        WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE);        return wm.getConnectionInfo().getLinkSpeed();    } else if (info.getType() == ConnectivityManager.TYPE_MOBILE) {        TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);        return tm.getNetworkType();    }    return 0;}

An example usage would then be:

if (network) {    if (bandwidth > 16) {        // Code for large items    } else if (bandwidth <= 16 && bandwidth > 8) {        // Code for medium items    } else {        //Code for small items    }} else {    //Code for disconnected}

It's not the prettiest, but it allows enough flexibility that I can change the bandwidth cutoff for items depending on what they are and my requirements for them.


If using Android Annotations is an option for you try this in your activities - that's all, the rest is generated:

@Receiver(actions = ConnectivityManager.CONNECTIVITY_ACTION,        registerAt = Receiver.RegisterAt.OnResumeOnPause)void onConnectivityChange() {    //react}

Use this only if you already use AndroidAnnotations - putting this dependency inside your project only for this piece of code would be overkill.