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
- Android学习之 监听网络连接状态的改变
- android 监听网络连接状态的改变
- android 监听网络连接状态的改变
- android 监听网络连接状态的改变
- android 监听网络连接状态的改变
- android 监听网络连接状态的改变
- android 监听网络连接状态的改变
- android 监听网络连接状态的改变
- android 监听网络连接状态的改变
- android监听手机网络连接状态改变的后台服务
- Android:使用Broadcast Receiver监听网络连接状态的改变
- android编程之网络连接状态改变
- android 监听网络连接状态的变化
- 监听网络状态的改变
- 监听网络状态的改变
- Android 监听网络连接状态
- Android 通过广播监听USB连接状态的改变
- 监听网络状态改变
- sscanf函数学习
- PAT1004. Counting Leaves
- PS CS4 改变文字字体时弹出“ 无法完成请求 因为程序错误”信息的解决方法
- POJ 2486 Apple Tree(树形dp)
- Android Fragment完全解析,关于碎片你所需知道的一切
- Android学习之 监听网络连接状态的改变
- single num--唯一一个只出现一次 的数
- CSS3下不一样的阴影、背景和圆角边框样式
- 哈希表对字符串的高效处理2:在一个字符中删除第二个字符出现过的所有字符
- 一种使用QThread线程的新方法QObject::moveToThread
- 扩展GCD 中国剩余定理(CRT) 乘法逆元模版
- Install Lenovo E430c wireless driver in linux Mint
- Xcode 工程info.plist 文件
- eclipse安装EGit插件(一)