检测网络状态改变类:

1、注册网络状态广播;

2、检查网络状态;

3、注销网络状态广播;

4、获取当前网络状态,true为网络连接成功,否则网络连接失败;

5、注册网络连接观察者;

6、注销网络连接观察者。

 import java.util.ArrayList;

 import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log; import com.example.androidnetworkdemo.observer.NetChangeObserver;
import com.example.androidnetworkdemo.utils.NetWorkUtil;
import com.example.androidnetworkdemo.utils.NetWorkUtil.NetType; /**
* 是一个检测网络状态改变的,需要配置
* <receiver android:name="com.osrad.common.receiver.OSNetworkStateReceiver" >
* <intent-filter>
* <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
* <action android:name="os.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" />
*/
public class NetworkStateReceiver extends BroadcastReceiver { private static Boolean networkAvailable = false;
private static NetType netType;
private static ArrayList<NetChangeObserver> netChangeObserverArrayList = new ArrayList<NetChangeObserver>();
private final static String ANDROID_NET_CHANGE_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
public final static String OS_ANDROID_NET_CHANGE_ACTION = "os.android.net.conn.CONNECTIVITY_CHANGE";
private static BroadcastReceiver receiver; private static BroadcastReceiver getReceiver() {
if (receiver == null) {
receiver = new NetworkStateReceiver();
}
return receiver;
} @Override
public void onReceive(Context context, Intent intent) {
receiver = NetworkStateReceiver.this;
if (intent.getAction().equalsIgnoreCase(ANDROID_NET_CHANGE_ACTION) || intent.getAction().equalsIgnoreCase(OS_ANDROID_NET_CHANGE_ACTION)) {
if (!NetWorkUtil.isNetworkAvailable(context)) {
networkAvailable = false;
} else {
netType = NetWorkUtil.getAPNType(context);
networkAvailable = true;
}
notifyObserver();
}
} /**
* 注册网络状态广播
*
* @param mContext
*/
public static void registerNetworkStateReceiver(Context mContext) { IntentFilter filter = new IntentFilter();
filter.addAction(OS_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(OS_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) {
Log.d(NetworkStateReceiver.class.getName(), 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++) {
NetChangeObserver observer = netChangeObserverArrayList.get(i);
if (observer != null) {
if (isNetworkAvailable()) {
observer.onNetConnect(netType);
} else {
observer.onNetDisconnect();
}
}
}
} /**
* 注册网络连接观察者
*
* @param observer 观察者实例
*/
public static void registerObserver(NetChangeObserver observer) {
if (netChangeObserverArrayList == null) {
netChangeObserverArrayList = new ArrayList<NetChangeObserver>();
}
netChangeObserverArrayList.add(observer);
} /**
* 注销网络连接观察者
*
* @param observer 观察者实例
*/
public static void removeRegisterObserver(NetChangeObserver observer) {
if (netChangeObserverArrayList != null) {
netChangeObserverArrayList.remove(observer);
}
} }

检测网络改变的观察者

 import com.example.androidnetworkdemo.utils.NetWorkUtil.NetType;

 /**
* 是检测网络改变的观察者
*/
public interface NetChangeObserver
{
/**
* 网络连接连接时调用
*/
public void onNetConnect(NetType type); /**
* 当前没有网络连接
*/
public void onNetDisconnect();
}

调用示例

 public class BaseApplication extends Application {

     private NetChangeObserver changeObserver = null;

     public static Activity currentActivity;

     @Override
public void onCreate() {
super.onCreate();
// 做初始化操作
doOnCreate();
} /**
* 此方法做初始化操作
*/
private void doOnCreate() {
// 声明observer注册到网络状态广播接收器中
changeObserver = new NetChangeObserver() {
@Override
public void onNetConnect(NetType type) {
BaseApplication.this.onNetConnect(type);
} @Override
public void onNetDisconnect() {
BaseApplication.this.onNetDisconnect();
}
};
// 注册网络状态监听对象
NetworkStateReceiver.registerObserver(changeObserver);
} /**
* 当前没有网络连接
*/
public void onNetDisconnect() {
if (currentActivity != null && currentActivity instanceof BaseActivity) {
((BaseActivity)currentActivity).onNetDisconnect();
}
} /**
* 网络连接连接时调用
*/
protected void onNetConnect(NetType type) {
if (currentActivity != null && currentActivity instanceof BaseActivity) {
((BaseActivity)currentActivity).onNetConnect(type);
}
} }

Android 开发工具类 19_NetworkStateReceiver的更多相关文章

  1. Android开发工具类

    7种无须编程的DIY开发工具 你知道几个? 现如今,各种DIY开发工具不断的出现,使得企业和个人在短短几分钟内就能完成应用的创建和发布,大大节省了在时间和资金上的投入.此外,DIY工 具的出现,也帮助 ...

  2. android开发工具类之获得WIFI IP地址或者手机网络IP

    有的时候我们需要获得WIFI的IP地址获得手机网络的IP地址,这是一个工具类,专门解决这个问题,这里需要两个权限: <uses-permission android:name="and ...

  3. android开发工具类总结(一)

    一.日志工具类 Log.java public class L { private L() { /* 不可被实例化 */ throw new UnsupportedOperationException ...

  4. Android 开发工具类 35_PatchUtils

    增量更新工具类[https://github.com/cundong/SmartAppUpdates] import java.io.File; import android.app.Activity ...

  5. Android 开发工具类 13_ SaxService

    网络 xml 解析方式 package com.example.dashu_saxxml; import java.io.IOException; import java.io.InputStream ...

  6. Android 开发工具类 06_NetUtils

    跟网络相关的工具类: 1.判断网络是否连接: 2.判断是否是 wifi 连接: 3.打开网络设置界面: import android.app.Activity; import android.cont ...

  7. Android 开发工具类 03_HttpUtils

    Http 请求的工具类: 1.异步的 Get 请求: 2.异步的 Post 请求: 3.Get 请求,获得返回数据: 4.向指定 URL 发送 POST方法的请求. import java.io.Bu ...

  8. Android 开发工具类 27_多线程下载大文件

    多线程下载大文件时序图 FileDownloader.java package com.wangjialin.internet.service.downloader; import java.io.F ...

  9. Android 开发工具类 12_PullXmlTools

    xml 格式数据 <?xml version="1.0" encoding="UTF-8"?> <user-list> <user ...

随机推荐

  1. 2018-2019-1 20189201 《LInux内核原理与分析》第九周作业

    那一天我二十一岁,在我一生的黄金时代.我有好多奢望.我想爱,想吃,还想在一瞬间变成天上半明半暗的云.那一年我二十一岁,在我一生的黄金时代.我有好多想法.我思索,想象,我不知该如何行动,我想知道一个城市 ...

  2. 转载 CSDN 谈谈我对证券公司一些部门的理解(前、中、后台)

    谈谈我对证券公司一些部门的理解(前.中.后台) 2018年02月08日 15:11:07 unirong 阅读数:2165   文中对各大部门的分析都是从作者多年经历总结出来的有感之谈,尤其是前台的6 ...

  3. C++类第五课:类的使用(三)[个人见解]

    继承既然已经知道了是什么意思了,下面我们来学封装! 什么是封装?我们来举个例子: 1.你不能随意挥霍父母的血汗钱,血汗钱是作为他们的私有财产,而父母因为某些原因会主动给你,你才能用的舒心,否则父母不会 ...

  4. 大数据 - Java基础:读取键盘输入的方法

    Java中获取键盘输入值的三种方法 程序编写中,从键盘获取数据是一件非常普通又平常的事 C:scanf() C++:cin() C#:Read().ReadKey().ReadLine() Java没 ...

  5. Unity-NGUI UILabel换行

    表里填写的是"\n",代码读出来会变成"\\n", 那就需要代码中将 "\\n" 重新变成 "\n" 才能够换行. st ...

  6. java课程之团队开发冲刺阶段1.3

    一.总结昨天进度 1.完成任务指标,但是有些问题没有得到根本上解决,只是换方式解决了 2.使用时间:6小时 二.遇到的困难 1.在设置AlertDialog弹窗组件的时候,没有办法获取选中值,再实验多 ...

  7. 排查MongoDB CPU使用率高的问题

    1.公司业务调整,把一部分数据由Redis转至MongoDB,业务在测试环境正常,生产环境上线后发现压力一上来MongoDB的服务直接把CPU占满了,和开发的同学分析了一下也参考了一下百度上类似的问题 ...

  8. web全套资料 干货满满 各种文章详解

    sql注入l MySqlMySQL False注入及技巧总结MySQL 注入攻击与防御sql注入学习总结SQL注入防御与绕过的几种姿势MySQL偏门技巧mysql注入可报错时爆表名.字段名.库名高级S ...

  9. Python基础之模块+异常

    一.模块相关概念 1.定义:包含一系列数据.函数.类的文件,通常以.py结尾. 2.作用:让一些相关的数据,函数,类有逻辑的组织在一起,使逻辑结构更加清晰.有利于多人合作开发. 3.模块导入方式(三种 ...

  10. HTML标签 按功能排序

    按功能类别排列 New : HTML5 中的新标签. 基础 标签 描述 <!DOCTYPE>  定义文档类型. <html> 定义 HTML 文档. <title> ...