一、应用场景:
1、应用在运行的过程中,如果突然断开网络连接、或由3G网络切换至WIFI网络 要求应用程序能随时监听到、并友好地提示用户。
2、最近在开发中有一个需求是WIFI体验馆购物:用户一进入含有指定WIFI的店铺、将自动连接WIFI、并弹出WIFI购物的提示给用户。
这里我们可以使用设计模式之观察者模式来完成此模块的需求、关于观察者模式的介绍请阅读我的上一遍日志:JAVA设计模式之 观察者模式【Observer Pattern】
二、代码展示:
1、关于网络类型的枚举类:NetType.java
package com.ice.android.common.net;
/**
* 网络类型枚举类
* @author ice
*
*/
public enum NetType {
WIFI,CMNET,CMWAP,NONENET;
}
2、监听网络状态改变的观察者接口:NetChangeObserver.java
package com.ice.android.common.net;
/**
* 监听网络状态改变的观察者
* @author ice
*
*/
public interface NetChangeObserver {
/**
* 网络状态连接时调用
*/
public void OnConnect(NetType netType);
/**
* 网络状态断开时调用
*/
public void OnDisConnect();
}
3、检测网络状态改变的广播接收器:NetWorkStateReceiver.java <在此模块的设计中他的角色是 被观察者>
package com.ice.android.common.net;
import java.util.ArrayList;
import com.ice.android.common.utils.NetWorkHelper;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
/**
* 检测网络状态改变的广播接收器 <br>
* 在网络状态改变监听过程<观察者模式>中 我们可以把他看做是一个被观察者 <br>
* @Description 是一个检测网络状态改变的,需要配置
* <receiver android:name="com.ice.android.common.net.NetWorkStateReceiver" >
* <intent-filter>
* <action android:name="android.net.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 ice
*
*/
public class NetWorkStateReceiver extends BroadcastReceiver {
private static final String TAG = "NetWorkStateReceiver";
private static final String ANDROID_NET_CHANGE_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
/** 储存所有的网络状态观察者集合 */
private static ArrayList<NetChangeObserver> netChangeObserverArrayList = new ArrayList<NetChangeObserver>();
private static boolean networkAvailable = true;
private NetType netType;
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equalsIgnoreCase(ANDROID_NET_CHANGE_ACTION)){
Log.d(TAG, "网络状态发生了改变...");
NetWorkHelper netWorkHelper = NetWorkHelper.getInstance(context);
if(!netWorkHelper.isNetworkAvailable()){
networkAvailable = false;
Log.d(TAG, "网络连接断开...");
}else{
netType = netWorkHelper.getAPNType();
networkAvailable = true;
Log.d(TAG, "网络连接成功..."+"| 当前的网络类型为: "+netType);
}
// 通知所有注册了的网络状态观察者
notifyObserver();
}
}
/**
* 添加/注册网络连接状态观察者
* @param observer
*/
public static void registerNetStateObserver(NetChangeObserver observer){
if(netChangeObserverArrayList == null){
netChangeObserverArrayList = new ArrayList<NetChangeObserver>();
}
netChangeObserverArrayList.add(observer);
}
/**
* 删除/注销网络连接状态观察者
* @param observer
*/
public static void unRegisterNetStateObserver(NetChangeObserver observer){
if(netChangeObserverArrayList != null){
netChangeObserverArrayList.remove(observer);
}
}
/**
* 向所有的观察者发送通知:网络状态发生改变咯...
*/
private void notifyObserver(){
if(netChangeObserverArrayList !=null && netChangeObserverArrayList.size() >0){
for(NetChangeObserver observer : netChangeObserverArrayList){
if(observer != null){
if(networkAvailable){
observer.OnConnect(netType);
}else{
observer.OnDisConnect();
}
}
}
}
}
}
4、注意在AndroidManifest.xml 需要配置网络相关权限和<receiver ........> </receiver>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<!-- 全局网络状态监听广播接收器 -->
<receiver android:name="com.ice.android.common.net.NetWorkStateReceiver">
<intent-filter >
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
5、最重要的部分 需要在 需要监听网络状态改变的Activity实现NetChangeObserver接口,并在onCreate()方法中注册成为一个NetWorkStateReceiver观察者、及在onDestroy()方法中注销观察者:
package com.ice.android;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import com.ice.android.common.net.NetChangeObserver;
import com.ice.android.common.net.NetType;
import com.ice.android.common.net.NetWorkStateReceiver;
public class MainActivity extends Activity implements NetChangeObserver{
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 注册为网络监听者/观察者
NetWorkStateReceiver.registerNetStateObserver(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
NetWorkStateReceiver.unRegisterNetStateObserver(this);
}
// 监听网络状态 当网络连接时调用该方法
@Override
public void OnConnect(NetType netType) {
Log.d(TAG, "网络已连接...");
Toast.makeText(this, "网络已连接...", Toast.LENGTH_LONG).show();
}
// 监听网络状态 当网络连接断开时调用该方法
@Override
public void OnDisConnect() {
Log.d(TAG, "网络已断开...");
Toast.makeText(this, "网络已断开...", Toast.LENGTH_LONG).show();
}
}