技术控

    今日:0| 主题:63445
收藏本版 (1)
最新软件应用技术尽在掌握

[其他] 使用广播监听网络变化

[复制链接]
撒浪嘿哟 发表于 2016-10-3 21:43:23
880 22
NetMonitor

  使用广播监听网络变化

  需求确认

  
       
  • 监听当前网络的状态和类型   
  • 类似京东客户端,当网络发生变化时相应更新UI界面  
   

使用广播监听网络变化

使用广播监听网络变化

   github地址: https://github.com/GHdeng/NetMonitor
  制作流程

  
       
  • 使用广播监听当前网络的状态。   
  • 配合Application周期注册监听,使得每个界面都继续监听   
  • 抽出BaseActivity类实现回调  
  1.继承BroadcastReceiver实现onReceive方法来判断当前网络是否连接,然后通过更新NetChangeObserver来实现回调。
  加入权限
  1. < uses-permission android:name="android.permission.INTERNET" />
  2. < uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  3. < uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
复制代码
  1. /**
  2. * 使用广播去监听网络
  3. * Created by deng on 16/9/13.
  4. */
  5. public class NetStateReceiver extends BroadcastReceiver {
  6.     public final static String CUSTOM_ANDROID_NET_CHANGE_ACTION = "com.zhanyun.api.netstatus.CONNECTIVITY_CHANGE";
  7.     private final static String ANDROID_NET_CHANGE_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
  8.     private final static String TAG = NetStateReceiver.class.getSimpleName();
  9.     private static boolean isNetAvailable = false;
  10.     private static NetUtils.NetType mNetType;
  11.     private static ArrayList<NetChangeObserver> mNetChangeObservers = new ArrayList<NetChangeObserver>();
  12.     private static BroadcastReceiver mBroadcastReceiver;
  13.     private static BroadcastReceiver getReceiver() {
  14.         if (null == mBroadcastReceiver) {
  15.             synchronized (NetStateReceiver.class) {
  16.                 if (null == mBroadcastReceiver) {
  17.                     mBroadcastReceiver = new NetStateReceiver();
  18.                 }
  19.             }
  20.         }
  21.         return mBroadcastReceiver;
  22.     }
  23.     @Override
  24.     public void onReceive(Context context, Intent intent) {
  25.         mBroadcastReceiver = NetStateReceiver.this;
  26.         if (intent.getAction().equalsIgnoreCase(ANDROID_NET_CHANGE_ACTION) || intent.getAction().equalsIgnoreCase(CUSTOM_ANDROID_NET_CHANGE_ACTION)) {
  27.             if (!NetUtils.isNetworkAvailable(context)) {
  28.                 LogHelper.e(this.getClass(), "<--- network disconnected --->");
  29.                 isNetAvailable = false;
  30.             } else {
  31.                 LogHelper.e(this.getClass(), "<--- network connected --->");
  32.                 isNetAvailable = true;
  33.                 mNetType = NetUtils.getAPNType(context);
  34.             }
  35.             notifyObserver();
  36.         }
  37.     }
  38.     /**
  39.      * 注册
  40.      *
  41.      * @param mContext
  42.      */
  43.     public static void registerNetworkStateReceiver(Context mContext) {
  44.         IntentFilter filter = new IntentFilter();
  45.         filter.addAction(CUSTOM_ANDROID_NET_CHANGE_ACTION);
  46.         filter.addAction(ANDROID_NET_CHANGE_ACTION);
  47.         mContext.getApplicationContext().registerReceiver(getReceiver(), filter);
  48.     }
  49.     /**
  50.      * 清除
  51.      *
  52.      * @param mContext
  53.      */
  54.     public static void checkNetworkState(Context mContext) {
  55.         Intent intent = new Intent();
  56.         intent.setAction(CUSTOM_ANDROID_NET_CHANGE_ACTION);
  57.         mContext.sendBroadcast(intent);
  58.     }
  59.     /**
  60.      * 反注册
  61.      *
  62.      * @param mContext
  63.      */
  64.     public static void unRegisterNetworkStateReceiver(Context mContext) {
  65.         if (mBroadcastReceiver != null) {
  66.             try {
  67.                 mContext.getApplicationContext().unregisterReceiver(mBroadcastReceiver);
  68.             } catch (Exception e) {
  69.             }
  70.         }
  71.     }
  72.     public static boolean isNetworkAvailable() {
  73.         return isNetAvailable;
  74.     }
  75.     public static NetUtils.NetType getAPNType() {
  76.         return mNetType;
  77.     }
  78.     private void notifyObserver() {
  79.         if (!mNetChangeObservers.isEmpty()) {
  80.             int size = mNetChangeObservers.size();
  81.             for (int i = 0; i < size; i++) {
  82.                 NetChangeObserver observer = mNetChangeObservers.get(i);
  83.                 if (observer != null) {
  84.                     if (isNetworkAvailable()) {
  85.                         observer.onNetConnected(mNetType);
  86.                     } else {
  87.                         observer.onNetDisConnect();
  88.                     }
  89.                 }
  90.             }
  91.         }
  92.     }
  93.     /**
  94.      * 添加网络监听
  95.      *
  96.      * @param observer
  97.      */
  98.     public static void registerObserver(NetChangeObserver observer) {
  99.         if (mNetChangeObservers == null) {
  100.             mNetChangeObservers = new ArrayList<NetChangeObserver>();
  101.         }
  102.         mNetChangeObservers.add(observer);
  103.     }
  104.     /**
  105.      * 移除网络监听
  106.      *
  107.      * @param observer
  108.      */
  109.     public static void removeRegisterObserver(NetChangeObserver observer) {
  110.         if (mNetChangeObservers != null) {
  111.             if (mNetChangeObservers.contains(observer)) {
  112.                 mNetChangeObservers.remove(observer);
  113.             }
  114.         }
  115.     }
  116. }
复制代码
2.回调接口

  1. /**
  2. * 网络改变观察者,观察网络改变后回调的方法
  3. * Created by deng on 16/9/13.
  4. */
  5. public interface NetChangeObserver {
  6.     /**
  7.      * 网络连接回调 type为网络类型
  8.      */
  9.      void onNetConnected(NetUtils.NetType type);
  10.     /**
  11.      * 没有网络
  12.      */
  13.      void onNetDisConnect();
  14. }
复制代码
3.网络状态工具类

  1. public class NetUtils {
  2.     public static enum NetType {
  3.         WIFI, CMNET, CMWAP, NONE
  4.     }
  5.     public static boolean isNetworkAvailable(Context context) {
  6.         ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
  7.         NetworkInfo[] info = mgr.getAllNetworkInfo();
  8.         if (info != null) {
  9.             for (int i = 0; i < info.length; i++) {
  10.                 if (info[i].getState() == NetworkInfo.State.CONNECTED) {
  11.                     return true;
  12.                 }
  13.             }
  14.         }
  15.         return false;
  16.     }
  17.     public static boolean isNetworkConnected(Context context) {
  18.         if (context != null) {
  19.             ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
  20.             NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
  21.             if (mNetworkInfo != null) {
  22.                 return mNetworkInfo.isAvailable();
  23.             }
  24.         }
  25.         return false;
  26.     }
  27.     public static boolean isWifiConnected(Context context) {
  28.         if (context != null) {
  29.             ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
  30.             NetworkInfo mWiFiNetworkInfo = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
  31.             if (mWiFiNetworkInfo != null) {
  32.                 return mWiFiNetworkInfo.isAvailable();
  33.             }
  34.         }
  35.         return false;
  36.     }
  37.     public static boolean isMobileConnected(Context context) {
  38.         if (context != null) {
  39.             ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
  40.             NetworkInfo mMobileNetworkInfo = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
  41.             if (mMobileNetworkInfo != null) {
  42.                 return mMobileNetworkInfo.isAvailable();
  43.             }
  44.         }
  45.         return false;
  46.     }
  47.     public static int getConnectedType(Context context) {
  48.         if (context != null) {
  49.             ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
  50.             NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
  51.             if (mNetworkInfo != null && mNetworkInfo.isAvailable()) {
  52.                 return mNetworkInfo.getType();
  53.             }
  54.         }
  55.         return -1;
  56.     }
  57.     public static NetType getAPNType(Context context) {
  58.         ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
  59.         NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
  60.         if (networkInfo == null) {
  61.             return NetType.NONE;
  62.         }
  63.         int nType = networkInfo.getType();
  64.         if (nType == ConnectivityManager.TYPE_MOBILE) {
  65.             if (networkInfo.getExtraInfo().toLowerCase(Locale.getDefault()).equals("cmnet")) {
  66.                 return NetType.CMNET;
  67.             } else {
  68.                 return NetType.CMWAP;
  69.             }
  70.         } else if (nType == ConnectivityManager.TYPE_WIFI) {
  71.             return NetType.WIFI;
  72.         }
  73.         return NetType.NONE;
  74.     }
  75. }
复制代码
4.在Application中注册

  1. @Override
  2.     public void onCreate() {
  3.         super.onCreate();
  4.         instance = this;
  5.         /*开启网络广播监听*/
  6.          NetStateReceiver.registerNetworkStateReceiver(instance);
  7.     }
  8.     @Override
  9.     public void onLowMemory() {
  10.         if (instance != null) {
  11.                     NetStateReceiver.unRegisterNetworkStateReceiver(instance);
  12.             android.os.Process.killProcess(android.os.Process.myPid());
  13.             exitApp();
  14.         }
  15.         super.onLowMemory();
  16.     }
复制代码
5.为了监听每一个Activity就抽取出来一个抽象类

  1. /**
  2.      * 网络观察者
  3.      */
  4.     protected NetChangeObserver mNetChangeObserver = null;
  5.     @Override
  6.     protected void onCreate(Bundle savedInstanceState) {
  7. // 网络改变的一个回掉类
  8.         mNetChangeObserver = new NetChangeObserver() {
  9.             @Override
  10.             public void onNetConnected(NetUtils.NetType type) {
  11.                 onNetworkConnected(type);
  12.             }
  13.             @Override
  14.             public void onNetDisConnect() {
  15.                 onNetworkDisConnected();
  16.             }
  17.         };
  18.         //开启广播去监听 网络 改变事件
  19.                 NetStateReceiver.registerObserver(mNetChangeObserver);
  20.     }
  21.     /**
  22.      * 网络连接状态
  23.      *
  24.      * @param type 网络状态
  25.      */
  26.     protected abstract void onNetworkConnected(NetUtils.NetType type);
  27.     /**
  28.      * 网络断开的时候调用
  29.      */
  30.     protected abstract void onNetworkDisConnected();
  31.     @Override
  32.     protected void onDestroy() {
  33.         super.onDestroy();
  34.         unbinder.unbind();
  35.                      NetStateReceiver.removeRegisterObserver(mNetChangeObserver);
  36.     }
复制代码
lllmmm 发表于 2016-10-4 05:32:54
买买买
回复 支持 反对

使用道具 举报

芥末小菜 发表于 2016-10-4 05:58:49
楼上的且行且珍惜!
回复 支持 反对

使用道具 举报

梦灵妮子 发表于 2016-10-4 07:06:30
回个帖子,下班咯~
回复 支持 反对

使用道具 举报

LUN 发表于 2016-10-10 21:26:06
一瓶酱油,打尽多少经验;一句挽尊,顶起多少秒沉。
回复 支持 反对

使用道具 举报

神吐槽 发表于 2016-10-11 21:34:32
出问题先从自己身上找原因,别一便秘就怪地球没引力.
回复 支持 反对

使用道具 举报

kc117 发表于 2016-10-14 09:02:03
看帖要回,回帖才健康,在踩踩,楼主辛苦了!
回复 支持 反对

使用道具 举报

黄娟 发表于 2016-10-14 21:19:24
沙发???
回复 支持 反对

使用道具 举报

onvh3263 发表于 2016-10-20 05:37:58
不觉名利。。。。。
回复 支持 反对

使用道具 举报

fopqg 发表于 2016-10-20 10:07:56
走过,路过,千万不要错过,顶一下!
回复 支持 反对

使用道具 举报

我要投稿

回页顶回复上一篇下一篇回列表
手机版/c.CoLaBug.com ( 粤ICP备05003221号 | 粤公网安备 44010402000842号 )

© 2001-2017 Comsenz Inc.

返回顶部 返回列表