检测网络状态改变类:

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. C语言第零次作业

    Q1.你对网络专业或者计算机专业了解是怎样? 说实话不了解网络专业,在甚至在填志愿之前我都不曾听说过.但经过一番的查阅资料.现在,首先我了解到我们主要学习计算机.通信以及网络方面的基础理论.设计原理, ...

  2. easynetq发布订阅demo实现注意事项

    最近开始在项目中使用easynetq,大概了解了下api,在网上看了下示例,结果没有一个运行成功的,一个最简单的发布订阅都没有成功.我是直接运行起来别人的示例,不应该啊,后来一直分析一直分析,最后发现 ...

  3. js-面试题-驼峰命名

    //将字符串转为驼峰命名‘foo-bar-car-day-efg’ function toUpperCase(str){ var string=str.split('-'); var arr=[]; ...

  4. 对Jpa中Entity关系映射中mappedBy的理解

    mappedBy 单向关系不需要设置该属性,双向关系必须设置,避免双方都建立外键字段数据库中1对多的关系,关联关系总是被多方维护的即外键建在多方,我们在单方对象的@OneToMany(mappedby ...

  5. 1、初识Java

    1.计算机发展过程 2.Java简史 lSUN公司是一家什么样的公司? 美国SUN(Stanford University Network)公司 在中国大陆的正式中文名为“太阳计算机系统(中国)有限公 ...

  6. python学习:利用循环语句完善输入设置

    利用循环语句完善输入设置 使用for循环: 代码1:_user = "alex"_password = "abc123" for i in range(3): ...

  7. 图解Raft之领导者选举

    图解Raft领导者选举,这里通过五张图来解答Raft选举的全过程: Raft集群各个节点之间是通过RPC通讯传递消息的,每个节点都包含一个RPC服务端与客户端,初始时启动RPC服务端.状态设置为Fol ...

  8. web项目如何使用Material Icons

    使用文档链接 图标库 最简单的使用方法 引入 <link href="https://fonts.googleapis.com/icon?family=Material+Icons&q ...

  9. Linux下CenOS系统 安装Mysql-5.7.19

    1.输入网址https://www.mysql.com/downloads/,进入downloads,选择Community 2.选择对应的版本和系统: 输入命令:wget https://cdn.m ...

  10. tag cloud的相关资料

    http://reverland.org/python/2013/01/28/visualize-your-shell-history/ https://github.com/reverland/sc ...