現在用到網絡監聽的地方越來越廣泛,這裏提供下ThinkAndroid裏的實現方法,還是根據功能原理倒着給出代碼:
1、網絡狀態會發出廣播,監聽網絡狀態肯定通過廣播接收者實現,廣播接受者:
/**
* @Title NetworkStateReceiver
* @Package com.ta.util.netstate
* @Description 是一個檢測網絡狀態改變的,需要配置 <receiver
* android:name="com.ta.util.netstate.TANetworkStateReceiver" >
* <intent-filter> <action
* android:name="android.net.conn.CONNECTIVITY_CHANGE" /> <action
* android:name="android.gzcpc.conn.CONNECTIVITY_CHANGE" />
* </intent-filter> </receiver>
*
* 需要開啓權限 <uses-permission
* android:name="android.permission.CHANGE_NETWORK_STATE" />
* <uses-permission
* android:name="android.permission.CHANGE_WIFI_STATE" />
* <uses-permission
* android:name="android.permission.ACCESS_NETWORK_STATE" />
* <uses-permission
* android:name="android.permission.ACCESS_WIFI_STATE" />
* @author 白貓
* @date 2013-5-5 下午 22:47
* @version V1.2
*/
public class TANetworkStateReceiver extends BroadcastReceiver
{
private static Boolean networkAvailable = false;
private static netType netType;
private static ArrayList<TANetChangeObserver> netChangeObserverArrayList = new ArrayList<TANetChangeObserver>();
private final static String ANDROID_NET_CHANGE_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
public final static String TA_ANDROID_NET_CHANGE_ACTION = "ta.android.net.conn.CONNECTIVITY_CHANGE";
private static BroadcastReceiver receiver;
private static BroadcastReceiver getReceiver()
{
if (receiver == null)
{
receiver = new TANetworkStateReceiver();
}
return receiver;
}
@Override
public void onReceive(Context context, Intent intent)
{
receiver = TANetworkStateReceiver.this;
if (intent.getAction().equalsIgnoreCase(ANDROID_NET_CHANGE_ACTION)
|| intent.getAction().equalsIgnoreCase(
TA_ANDROID_NET_CHANGE_ACTION))
{
TALogger.i(TANetworkStateReceiver.this, "網絡狀態改變.");
if (!TANetWorkUtil.isNetworkAvailable(context))
{
TALogger.i(TANetworkStateReceiver.this, "沒有網絡連接.");
networkAvailable = false;
} else
{
TALogger.i(TANetworkStateReceiver.this, "網絡連接成功.");
netType = TANetWorkUtil.getAPNType(context);
networkAvailable = true;
}
notifyObserver();
}
}
/**
* 註冊網絡狀態廣播
*
* @param mContext
*/
public static void registerNetworkStateReceiver(Context mContext)
{
IntentFilter filter = new IntentFilter();
filter.addAction(TA_ANDROID_NET_CHANGE_ACTION);
filter.addAction(ANDROID_NET_CHANGE_ACTION);
mContext.getApplicationContext()
.registerReceiver(getReceiver(), filter);
}
/**
* 檢查網絡狀態
*
* @param mContext
*/
public static void checkNetworkState(Context mContext)
{
Intent intent = new Intent();
intent.setAction(TA_ANDROID_NET_CHANGE_ACTION);
mContext.sendBroadcast(intent);
}
/**
* 註銷網絡狀態廣播
*
* @param mContext
*/
public static void unRegisterNetworkStateReceiver(Context mContext)
{
if (receiver != null)
{
try
{
mContext.getApplicationContext().unregisterReceiver(receiver);
} catch (Exception e)
{
// TODO: handle exception
TALogger.d("TANetworkStateReceiver", e.getMessage());
}
}
}
/**
* 獲取當前網絡狀態,true爲網絡連接成功,否則網絡連接失敗
*
* @return
*/
public static Boolean isNetworkAvailable()
{
return networkAvailable;
}
public static netType getAPNType()
{
return netType;
}
private void notifyObserver()
{
for (int i = 0; i < netChangeObserverArrayList.size(); i++)
{
TANetChangeObserver observer = netChangeObserverArrayList.get(i);
if (observer != null)
{
if (isNetworkAvailable())
{
observer.onConnect(netType);
} else
{
observer.onDisConnect();
}
}
}
}
/**
* 註冊網絡連接觀察者
*
* @param observerKey
* observerKey
*/
public static void registerObserver(TANetChangeObserver observer)
{
if (netChangeObserverArrayList == null)
{
netChangeObserverArrayList = new ArrayList<TANetChangeObserver>();
}
netChangeObserverArrayList.add(observer);
}
/**
* 註銷網絡連接觀察者
*
* @param resID
* observerKey
*/
public static void removeRegisterObserver(TANetChangeObserver observer)
{
if (netChangeObserverArrayList != null)
{
netChangeObserverArrayList.remove(observer);
}
}
}
2、廣播接受者接收到廣播後,是通過設置好的觀察者,傳遞迴信息的,觀察者:
/**
* @Title TANetChangeObserver
* @Package com.ta.util.netstate
* @Description 是檢測網絡改變的觀察者
* @author 白貓
* @date 2013-1-22 下午 9:35
* @version V1.0
*/
public class TANetChangeObserver
{
/**
* 網絡連接連接時調用
*/
public void onConnect(netType type)
{
}
/**
* 當前沒有網絡連接
*/
public void onDisConnect()
{
}
}
3、觀察者,就是一個監聽接口。廣播接收者裏用到的工具類:
/**
* @Title NetWorkUtil
* @Package com.ta.util.netstate
* @Description 是檢測網絡的一個工具包
* @author 白貓
* @date 2013-1-22 下午 9:35
* @version V1.0
*/
public class TANetWorkUtil
{
public static enum netType
{
wifi, CMNET, CMWAP, noneNet
}
/**
* 網絡是否可用
*
* @param context
* @return
*/
public static boolean isNetworkAvailable(Context context)
{
ConnectivityManager mgr = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo[] info = mgr.getAllNetworkInfo();
if (info != null)
{
for (int i = 0; i < info.length; i++)
{
if (info[i].getState() == NetworkInfo.State.CONNECTED)
{
return true;
}
}
}
return false;
}
/**
* 判斷是否有網絡連接
*
* @param context
* @return
*/
public static boolean isNetworkConnected(Context context)
{
if (context != null)
{
ConnectivityManager mConnectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mNetworkInfo = mConnectivityManager
.getActiveNetworkInfo();
if (mNetworkInfo != null)
{
return mNetworkInfo.isAvailable();
}
}
return false;
}
/**
* 判斷WIFI網絡是否可用
*
* @param context
* @return
*/
public static boolean isWifiConnected(Context context)
{
if (context != null)
{
ConnectivityManager mConnectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mWiFiNetworkInfo = mConnectivityManager
.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (mWiFiNetworkInfo != null)
{
return mWiFiNetworkInfo.isAvailable();
}
}
return false;
}
/**
* 判斷MOBILE網絡是否可用
*
* @param context
* @return
*/
public static boolean isMobileConnected(Context context)
{
if (context != null)
{
ConnectivityManager mConnectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mMobileNetworkInfo = mConnectivityManager
.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (mMobileNetworkInfo != null)
{
return mMobileNetworkInfo.isAvailable();
}
}
return false;
}
/**
* 獲取當前網絡連接的類型信息
*
* @param context
* @return
*/
public static int getConnectedType(Context context)
{
if (context != null)
{
ConnectivityManager mConnectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mNetworkInfo = mConnectivityManager
.getActiveNetworkInfo();
if (mNetworkInfo != null && mNetworkInfo.isAvailable())
{
return mNetworkInfo.getType();
}
}
return -1;
}
/**
*
* @author 白貓
*
* 獲取當前的網絡狀態 -1:沒有網絡 1:WIFI網絡2:wap 網絡3:net網絡
*
* @param context
*
* @return
*/
public static netType getAPNType(Context context)
{
ConnectivityManager connMgr = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if (networkInfo == null)
{
return netType.noneNet;
}
int nType = networkInfo.getType();
if (nType == ConnectivityManager.TYPE_MOBILE)
{
if (networkInfo.getExtraInfo().toLowerCase().equals("cmnet"))
{
return netType.CMNET;
}
else
{
return netType.CMWAP;
}
} else if (nType == ConnectivityManager.TYPE_WIFI)
{
return netType.wifi;
}
return netType.noneNet;
}
}
好了,網絡監聽就用到這三個類,來看看ThinkAndroid是怎麼用的:
由於網絡監聽是是對所有頁面起效,所以在Application創建的時候給廣播接收者設置一個全局的觀察者:
taNetChangeObserver = new TANetChangeObserver()
{
@Override
public void onConnect(netType type)
{
// TODO Auto-generated method stub
super.onConnect(type);
TAApplication.this.onConnect(type);
}
@Override
public void onDisConnect()
{
// TODO Auto-generated method stub
super.onDisConnect();
TAApplication.this.onDisConnect();
}
};
TANetworkStateReceiver.registerObserver(taNetChangeObserver);
/**
* 當前沒有網絡連接
*/
public void onDisConnect()
{
networkAvailable = false;
if (currentActivity != null)
{
currentActivity.onDisConnect();
}
}
/**
* 網絡連接連接時調用
*/
protected void onConnect(netType type)
{
// TODO Auto-generated method stub
networkAvailable = true;
if (currentActivity != null)
{
currentActivity.onConnect(type);
}
}
具體需要當網絡狀態變化時要進行什麼操作,只要在相應的Activity裏對onConnect、onDisConnect進行重寫就行。