- 监听当前网络的状态和类型
- 类似京东客户端,当网络发生变化时相应更新UI界面
github地址:github.com/GHdeng/NetM…[3]
- 使用广播监听当前网络的状态。
- 配合Application周期注册监听,使得每个界面都继续监听
- 抽出BaseActivity类实现回调
1.继承BroadcastReceiver实现onReceive方法来判断当前网络是否连接,然后通过更新NetChangeObserver来实现回调。
usespermission androidnameandroid.permission.INTERNET
usespermission androidnameandroid.permission.ACCESS_WIFI_STATE
usespermission androidnameandroid.permission.ACCESS_NETWORK_STATE
* 使用广播去监听网络
* Created by deng on 16/9/13.
public class NetStateReceiver extends BroadcastReceiver {
public final static String CUSTOM_ANDROID_NET_CHANGE_ACTION com.zhanyun.api.netstatus.CONNECTIVITY_CHANGE;
private final static String ANDROID_NET_CHANGE_ACTION android.net.conn.CONNECTIVITY_CHANGE;
private final static String NetStateReceiverclassgetSimpleName();
private static boolean isNetAvailable false;
private static NetUtilsNetType mNetType;
private static ArrayList<NetChangeObserver> mNetChangeObservers ArrayList<NetChangeObserver>();
private static BroadcastReceiver mBroadcastReceiver;
private static BroadcastReceiver getReceiver() {
( mBroadcastReceiver) {
synchronized (NetStateReceiverclass) {
( mBroadcastReceiver) {
mBroadcastReceiver NetStateReceiver();
}
}
}
return mBroadcastReceiver;
}
@Override
public onReceive(Context context, Intent intent) {
mBroadcastReceiver NetStateReceiver;
(intentgetAction()equalsIgnoreCase(ANDROID_NET_CHANGE_ACTION) intentgetAction()equalsIgnoreCase(CUSTOM_ANDROID_NET_CHANGE_ACTION)) {
(NetUtilsisNetworkAvailable(context)) {
LogHelpere(getClass(), <--- network disconnected --->);
isNetAvailable false;
} {
LogHelpere(getClass(), <--- network connected --->);
isNetAvailable ;
mNetType NetUtilsgetAPNType(context);
}
notifyObserver();
}
}
* @param mContext
public static registerNetworkStateReceiver(Context mContext) {
IntentFilter filter IntentFilter();
filteraddAction(CUSTOM_ANDROID_NET_CHANGE_ACTION);
filteraddAction(ANDROID_NET_CHANGE_ACTION);
mContextgetApplicationContext()registerReceiver(getReceiver(), filter);
}
* @param mContext
public static checkNetworkState(Context mContext) {
Intent intent Intent();
intentsetAction(CUSTOM_ANDROID_NET_CHANGE_ACTION);
mContextsendBroadcast(intent);
}
* @param mContext
public static unRegisterNetworkStateReceiver(Context mContext) {
(mBroadcastReceiver ) {
{
mContextgetApplicationContext()unregisterReceiver(mBroadcastReceiver);
} catch (Exception e) {
}
}
}
public static boolean isNetworkAvailable() {
return isNetAvailable;
}
public static NetUtils.NetType getAPNType() {
return mNetType;
}
private notifyObserver() {
(mNetChangeObserversisEmpty()) {
size mNetChangeObserverssize();
( i ; i size; i) {
NetChangeObserver observer mNetChangeObserversget(i);
(observer ) {
(isNetworkAvailable()) {
observeronNetConnected(mNetType);
} {
observeronNetDisConnect();
}
}
}
}
}
* 添加网络监听
* @param observer
public static registerObserver(NetChangeObserver observer) {
(mNetChangeObservers ) {
mNetChangeObservers ArrayList<NetChangeObserver>();
}
mNetChangeObserversadd(observer);
}
* 移除网络监听
* @param observer
public static removeRegisterObserver(NetChangeObserver observer) {
(mNetChangeObservers ) {
(mNetChangeObserverscontains(observer)) {
mNetChangeObserversremove(observer);
}
}
}
}
2.回调接口
* 网络改变观察者,观察网络改变后回调的方法
* Created by deng on 16/9/13.
public interface NetChangeObserver {
* 网络连接回调 type为网络类型
onNetConnected(NetUtils.NetType );
* 没有网络
onNetDisConnect();
}
3.网络状态工具类
public class NetUtils {
public static NetType {
, CMNET, CMWAP,
}
public static boolean isNetworkAvailable(Context context) {
ConnectivityManager mgr (ConnectivityManager) contextgetSystemService(ContextCONNECTIVITY_SERVICE);
NetworkInfo[] info mgrgetAllNetworkInfo();
(info ) {
( i ; i infolength; i) {
(info[i]getState() NetworkInfoStateCONNECTED) {
return ;
}
}
}
return false;
}
public static boolean isNetworkConnected(Context context) {
(context ) {
ConnectivityManager mConnectivityManager (ConnectivityManager) contextgetSystemService(ContextCONNECTIVITY_SERVICE);
NetworkInfo mNetworkInfo mConnectivityManagergetActiveNetworkInfo();
(mNetworkInfo ) {
return mNetworkInfoisAvailable();
}
}
return false;
}
public static boolean isWifiConnected(Context context) {
(context ) {
ConnectivityManager mConnectivityManager (ConnectivityManager) contextgetSystemService(ContextCONNECTIVITY_SERVICE);
NetworkInfo mWiFiNetworkInfo mConnectivityManagergetNetworkInfo(ConnectivityManagerTYPE_WIFI);
(mWiFiNetworkInfo ) {
return mWiFiNetworkInfoisAvailable();
}
}
return false;
}
public static boolean isMobileConnected(Context context) {
(context ) {
ConnectivityManager mConnectivityManager (ConnectivityManager) contextgetSystemService(ContextCONNECTIVITY_SERVICE);
NetworkInfo mMobileNetworkInfo mConnectivityManagergetNetworkInfo(ConnectivityManagerTYPE_MOBILE);
(mMobileNetworkInfo ) {
return mMobileNetworkInfoisAvailable();
}
}
return false;
}
public static getConnectedType(Context context) {
(context ) {
ConnectivityManager mConnectivityManager (ConnectivityManager) contextgetSystemService(ContextCONNECTIVITY_SERVICE);
NetworkInfo mNetworkInfo mConnectivityManagergetActiveNetworkInfo();
(mNetworkInfo mNetworkInfoisAvailable()) {
return mNetworkInfogetType();
}
}
return ;
}
public static NetType getAPNType(Context context) {
ConnectivityManager connMgr (ConnectivityManager) contextgetSystemService(ContextCONNECTIVITY_SERVICE);
NetworkInfo networkInfo connMgrgetActiveNetworkInfo();
(networkInfo ) {
return NetType;
}
nType networkInfogetType();
(nType ConnectivityManagerTYPE_MOBILE) {
(networkInfogetExtraInfo()toLowerCase(LocalegetDefault())equals(cmnet)) {
return NetTypeCMNET;
} {
return NetTypeCMWAP;
}
} (nType ConnectivityManagerTYPE_WIFI) {
return NetType;
}
return NetType;
}
}
4.在Application中注册
@Override
public onCreate() {
superonCreate();
instance ;
/*开启网络广播监听*/
NetStateReceiverregisterNetworkStateReceiver(instance);
}
@Override
public onLowMemory() {
(instance ) {
NetStateReceiverunRegisterNetworkStateReceiver(instance);
android.osProcesskillProcess(android.osProcessmyPid());
exitApp();
}
superonLowMemory();
}
5.为了监听每一个Activity就抽取出来一个抽象类
/**
* 网络观察者
*/
protected NetChangeObserver mNetChangeObserver = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
// 网络改变的一个回掉类
mNetChangeObserver = new NetChangeObserver() {
@Override
public void onNetConnected(NetUtils.NetType type) {
onNetworkConnected(type);
}
@Override
public void onNetDisConnect() {
onNetworkDisConnected();
}
};
//开启广播去监听 网络 改变事件
NetStateReceiver.registerObserver(mNetChangeObserver);
}
/**
* 网络连接状态
*
* @param type 网络状态
*/
protected abstract void onNetworkConnected(NetUtils.NetType type);
/**
* 网络断开的时候调用
*/
protected abstract void onNetworkDisConnected();
@Override
protected void onDestroy() {
super.onDestroy();
unbinder.unbind();
NetStateReceiver.removeRegisterObserver(mNetChangeObserver);
}