Android 네트워크 연결 상태 조회 및 이벤트 모니터

최근 프로젝트에서 단말기의 네트워크 연결 상태를 검사하고 연결 상태 변화 이벤트를 감청해야 한다. 모든 것은 사용자에게 더 좋은 체험을 주기 위해서이다. 사용자가 진정으로 관심을 가지는 네트워크 상태 변화 이벤트는'연결(Connected)'과'끊기(Disconnected)'이고 다른 이벤트는 주목받지 말아야 한다(모두 체험을 위해서).
국내에는 주로 두 종류의 네트워크, 와이파이와 GPRS가 있기 때문에 주로 이 두 네트워크에 대해 조회를 하고 다른 것은 고려하지 않았다
공구 코드를 붙여라, 필요한 학우들은 일을 좀 아껴서 불필요한 중복 노동을 피할 수 있다.
package org.dragonboy.net;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.NetworkInfo.State;
import android.support.v4.net.ConnectivityManagerCompat;

/**
 * @author [email protected]
 */
public class Connectivities {
	private Connectivities() {
	}

	/**
	 *     WIFI    ,    ——    ,     WIFI
	 * 
	 * @param context
	 * @return true            ,  WIFI,    false
	 */
	public static boolean isWifiConnected(Context context) {
		ConnectivityManager cm = (ConnectivityManager) context
				.getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo info = cm.getActiveNetworkInfo();
		if (info != null && info.isConnected()
				&& ConnectivityManager.TYPE_WIFI == info.getType()) {
			return true;
		}
		return false;
	}

	/**
	 *     GPRS    ,    ——    ,     GPRS
	 * 
	 * @param context
	 * @return true            ,  GPRS,    false
	 */
	public static boolean isGprsConnected(Context context) {
		ConnectivityManager cm = (ConnectivityManager) context
				.getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo info = cm.getActiveNetworkInfo();
		if (info != null && info.isConnected()
				&& ConnectivityManager.TYPE_MOBILE == info.getType()) {
			return true;
		}
		return false;
	}

	/**
	 *         
	 * 
	 * @param context
	 * @return true            ,    false
	 */
	public static boolean isConnected(Context context) {
		ConnectivityManager cm = (ConnectivityManager) context
				.getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo info = cm.getActiveNetworkInfo();
		if (info != null && info.isConnected()) {
			return true;
		}
		return false;
	}

	/**
	 *        ,           ,      ,      
	 * 
	 * @param context
	 * @return true      ,false     
	 */
	public static boolean isActiveNetworkMetered(Context context) {
		ConnectivityManager cm = (ConnectivityManager) context
				.getSystemService(Context.CONNECTIVITY_SERVICE);
		return ConnectivityManagerCompat.isActiveNetworkMetered(cm);
	}

	public static Intent registerReceiver(Context context,
			ConnectivityChangeReceiver receiver) {
		return context.registerReceiver(receiver,
				ConnectivityChangeReceiver.FILTER);
	}

	public static void unregisterReceiver(Context context,
			ConnectivityChangeReceiver receiver) {
		context.unregisterReceiver(receiver);
	}

	public static abstract class ConnectivityChangeReceiver extends
			BroadcastReceiver {
		public static final IntentFilter FILTER = new IntentFilter(
				ConnectivityManager.CONNECTIVITY_ACTION);

		@Override
		public final void onReceive(Context context, Intent intent) {
			ConnectivityManager cm = (ConnectivityManager) context
					.getSystemService(Context.CONNECTIVITY_SERVICE);
			NetworkInfo wifiInfo = cm
					.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
			NetworkInfo gprsInfo = cm
					.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

			//      Connected  
			boolean wifiConnected = false;
			boolean gprsConnected = false;
			if (wifiInfo != null && wifiInfo.isConnected()) {
				wifiConnected = true;
			}
			if (gprsInfo != null && gprsInfo.isConnected()) {
				gprsConnected = true;
			}
			if (wifiConnected || gprsConnected) {
				onConnected();
				return;
			}

			//      Disconnected  ,  :               !       
			boolean wifiDisconnected = false;
			boolean gprsDisconnected = false;
			if (wifiInfo == null || wifiInfo != null
					&& wifiInfo.getState() == State.DISCONNECTED) {
				wifiDisconnected = true;
			}
			if (gprsInfo == null || gprsInfo != null
					&& gprsInfo.getState() == State.DISCONNECTED) {
				gprsDisconnected = true;
			}
			if (wifiDisconnected && gprsDisconnected) {
				onDisconnected();
				return;
			}
		}

		protected abstract void onDisconnected();

		protected abstract void onConnected();
	}
}

좋은 웹페이지 즐겨찾기