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

来源:互联网 发布:mysql不等于查询 编辑:程序博客网 时间:2024/05/18 22:11

      一、应用场景:

            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;@Overridepublic 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";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);// 注册为网络监听者/观察者NetWorkStateReceiver.registerNetStateObserver(this);}@Overrideprotected void onDestroy() {super.onDestroy();NetWorkStateReceiver.unRegisterNetStateObserver(this);}// 监听网络状态  当网络连接时调用该方法@Overridepublic void OnConnect(NetType netType) {Log.d(TAG, "网络已连接...");Toast.makeText(this, "网络已连接...", Toast.LENGTH_LONG).show();}// 监听网络状态 当网络连接断开时调用该方法@Overridepublic void OnDisConnect() {Log.d(TAG, "网络已断开...");Toast.makeText(this, "网络已断开...", Toast.LENGTH_LONG).show();}}






1 0