zoukankan      html  css  js  c++  java
  • 监听网络状态

    网络监听的自己写过一个,刚在github上找到一个,先保存着,以后直接用

    原文地址:https://github.com/GHdeng/NetMonitor

    使用广播监听网络变化

    ###需求确认

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

    image

    ###制作流程

    1. 使用广播监听当前网络的状态。
    2. 配合Application周期注册监听,使得每个界面都继续监听
    3. 抽出BaseActivity类实现回调

    #####1.继承BroadcastReceiver实现onReceive方法来判断当前网络是否连接,然后通过更新NetChangeObserver来实现回调。 加入权限

    < uses-permission android:name="android.permission.INTERNET" />
    < uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
    < uses-permission android:name="android.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 TAG = NetStateReceiver.class.getSimpleName();
    
        private static boolean isNetAvailable = false;
        private static NetUtils.NetType mNetType;
        private static ArrayList<NetChangeObserver> mNetChangeObservers = new ArrayList<NetChangeObserver>();
        private static BroadcastReceiver mBroadcastReceiver;
    
        private static BroadcastReceiver getReceiver() {
            if (null == mBroadcastReceiver) {
                synchronized (NetStateReceiver.class) {
                    if (null == mBroadcastReceiver) {
                        mBroadcastReceiver = new NetStateReceiver();
                    }
                }
            }
            return mBroadcastReceiver;
        }
    
        @Override
        public void onReceive(Context context, Intent intent) {
            mBroadcastReceiver = NetStateReceiver.this;
            if (intent.getAction().equalsIgnoreCase(ANDROID_NET_CHANGE_ACTION) || intent.getAction().equalsIgnoreCase(CUSTOM_ANDROID_NET_CHANGE_ACTION)) {
                if (!NetUtils.isNetworkAvailable(context)) {
                    LogHelper.e(this.getClass(), "<--- network disconnected --->");
                    isNetAvailable = false;
                } else {
                    LogHelper.e(this.getClass(), "<--- network connected --->");
                    isNetAvailable = true;
                    mNetType = NetUtils.getAPNType(context);
                }
                notifyObserver();
            }
        }
    
        /**
         * 注册
         *
         * @param mContext
         */
        public static void registerNetworkStateReceiver(Context mContext) {
            IntentFilter filter = new IntentFilter();
            filter.addAction(CUSTOM_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(CUSTOM_ANDROID_NET_CHANGE_ACTION);
            mContext.sendBroadcast(intent);
        }
    
        /**
         * 反注册
         *
         * @param mContext
         */
        public static void unRegisterNetworkStateReceiver(Context mContext) {
            if (mBroadcastReceiver != null) {
                try {
                    mContext.getApplicationContext().unregisterReceiver(mBroadcastReceiver);
                } catch (Exception e) {
    
                }
            }
    
        }
    
        public static boolean isNetworkAvailable() {
            return isNetAvailable;
        }
    
        public static NetUtils.NetType getAPNType() {
            return mNetType;
        }
    
        private void notifyObserver() {
            if (!mNetChangeObservers.isEmpty()) {
                int size = mNetChangeObservers.size();
                for (int i = 0; i < size; i++) {
                    NetChangeObserver observer = mNetChangeObservers.get(i);
                    if (observer != null) {
                        if (isNetworkAvailable()) {
                            observer.onNetConnected(mNetType);
                        } else {
                            observer.onNetDisConnect();
                        }
                    }
                }
            }
        }
    
        /**
         * 添加网络监听
         *
         * @param observer
         */
        public static void registerObserver(NetChangeObserver observer) {
            if (mNetChangeObservers == null) {
                mNetChangeObservers = new ArrayList<NetChangeObserver>();
            }
            mNetChangeObservers.add(observer);
        }
    
        /**
         * 移除网络监听
         *
         * @param observer
         */
        public static void removeRegisterObserver(NetChangeObserver observer) {
            if (mNetChangeObservers != null) {
                if (mNetChangeObservers.contains(observer)) {
                    mNetChangeObservers.remove(observer);
                }
            }
        }
    }

    #####2.回调接口

    /**
     * 网络改变观察者,观察网络改变后回调的方法
     * Created by deng on 16/9/13.
     */
    public interface NetChangeObserver {
    
        /**
         * 网络连接回调 type为网络类型
         */
         void onNetConnected(NetUtils.NetType type);
    
        /**
         * 没有网络
         */
         void onNetDisConnect();
    }

    #####3.网络状态工具类

    public class NetUtils {
    
        public static enum NetType {
            WIFI, CMNET, CMWAP, NONE
        }
    
        public static boolean isNetworkAvailable(Context context) {
            ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo[] info = mgr.getAllNetworkInfo();
            if (info != null) {
                for (int i = 0; i < info.length; i++) {
                    if (info[i].getState() == NetworkInfo.State.CONNECTED) {
                        return true;
                    }
                }
            }
            return false;
        }
    
        public static boolean isNetworkConnected(Context context) {
            if (context != null) {
                ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
                if (mNetworkInfo != null) {
                    return mNetworkInfo.isAvailable();
                }
            }
            return false;
        }
    
        public static boolean isWifiConnected(Context context) {
            if (context != null) {
                ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo mWiFiNetworkInfo = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
                if (mWiFiNetworkInfo != null) {
                    return mWiFiNetworkInfo.isAvailable();
                }
            }
            return false;
        }
    
        public static boolean isMobileConnected(Context context) {
            if (context != null) {
                ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo mMobileNetworkInfo = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
                if (mMobileNetworkInfo != null) {
                    return mMobileNetworkInfo.isAvailable();
                }
            }
            return false;
        }
    
        public static int getConnectedType(Context context) {
            if (context != null) {
                ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
                if (mNetworkInfo != null && mNetworkInfo.isAvailable()) {
                    return mNetworkInfo.getType();
                }
            }
            return -1;
        }
    
        public static NetType getAPNType(Context context) {
            ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
            if (networkInfo == null) {
                return NetType.NONE;
            }
            int nType = networkInfo.getType();
    
            if (nType == ConnectivityManager.TYPE_MOBILE) {
                if (networkInfo.getExtraInfo().toLowerCase(Locale.getDefault()).equals("cmnet")) {
                    return NetType.CMNET;
                } else {
                    return NetType.CMWAP;
                }
            } else if (nType == ConnectivityManager.TYPE_WIFI) {
                return NetType.WIFI;
            }
            return NetType.NONE;
        }
    }

    #####4.在Application中注册

    @Override
        public void onCreate() {
            super.onCreate();
            instance = this;
    
            /*开启网络广播监听*/
             NetStateReceiver.registerNetworkStateReceiver(instance);
        }
        
        @Override
        public void onLowMemory() {
            if (instance != null) {
                        NetStateReceiver.unRegisterNetworkStateReceiver(instance);
                android.os.Process.killProcess(android.os.Process.myPid());
                exitApp();
            }
            super.onLowMemory();
        }

    #####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);
        }

    Use

    Maven
    <dependency>
      <groupId>com.caption</groupId>
      <artifactId>netmonitorlibrary</artifactId>
      <version>1.0.0</version>
      <type>pom</type>
    </dependency>
    Gradle
    compile 'com.caption:netmonitorlibrary:1.0.0'
  • 相关阅读:
    datasnap 2010 为DataSnap系统服务程序添加描述
    uLanguage.pas
    cxgrid上如何取FOOTER上合计的值
    cxgrid经典用法
    datasnap 2010 DataSnap服务端和客户端发布分发方法
    php_network_getaddresses: getaddrinfo failed 原因
    查看crontab运行状态
    laravel 开启定时任务需要操作
    解决cron不执行的问题
    UPdate语句
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/6888725.html
Copyright © 2011-2022 走看看