使用广播监听网络变化

2,510 阅读2分钟
原文链接: github.com
  • 监听当前网络的状态和类型
  • 类似京东客户端,当网络发生变化时相应更新UI界面

[1]

github地址:github.com/GHdeng/NetM…[3]

  1. 使用广播监听当前网络的状态。
  2. 配合Application周期注册监听,使得每个界面都继续监听
  3. 抽出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);
    }