Android学习之 监听网络连接状态的改变

      一、应用场景:

            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();
	}
	
}







评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值