• 检测网络变化(wifi、2g、3g、4g)


    检测网络变化(wifi、2g、3g、4g)

    1.注册广播"android.net.conn.CONNECTIVITY_CHANGE"和"android.net.wifi.STATE_CHANGE" 进行监听:
    private class ConnectivityBroadcastReceiver extends BroadcastReceiver {
            @Override
            public void onReceive(Context context, Intent intent) {
                try
                {
                    String action = intent.getAction();
                    Log.e("ConnectivityBroadcastReceiver", "action= "+action);
                    if ((!action.equals(ConnectivityManager.CONNECTIVITY_ACTION) 
                            && !action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION))
                            || !isListening_) {
                        return;
                    }
    
                    if(intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) { 
                        networkInfo_ = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); 
                        if(networkInfo_.isConnected()) { 
                            // WIFI is connected 
                            state_ = NET_STATE_WIFI_CONNECTED;
                        }else{
                            state_ = NET_STATE_DISCONNECTED;
                        }
                    } else if(intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) { 
                        networkInfo_ = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
                        String apn = networkInfo_.getExtraInfo();
                        Log.e("ConnectivityBroadcastReceiver", "apn= "+apn);
                        boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
                        if(networkInfo_.getType() == ConnectivityManager.TYPE_WIFI){ 
                            if ( networkInfo_.isConnected() ){
                                state_ = NET_STATE_WIFI_CONNECTED;
                            }else{
                                state_ = noConnectivity ? NET_STATE_DISCONNECTED : NET_STATE_WIFI_CONNECTED;
                            }
                        }else if(networkInfo_.getType() == ConnectivityManager.TYPE_MOBILE){
                            if (noConnectivity) {
                                state_ = NET_STATE_DISCONNECTED;
                            } else {
                                TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
                                int type = telephonyManager.getNetworkType();
                                Log.e("ConnectivityBroadcastReceiver", "type= "+type);
                                state_ = getNetworkClass(type);
                            }
                        }else {
                            if (noConnectivity) {
                                state_ = NET_STATE_DISCONNECTED;
                            } else {
                                state_ = NET_STATE_UNKNOWN;
                            }
                        }
                    } 
                    NotifyEvent();
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
    
            }
        };

    2.判断TYPE_MOBILE下的网络类型:

    private int getNetworkClass(int networkType) {  
            switch (networkType) {  
            case TelephonyManager.NETWORK_TYPE_GPRS:  
            case TelephonyManager.NETWORK_TYPE_EDGE:  
            case TelephonyManager.NETWORK_TYPE_CDMA:  
            case TelephonyManager.NETWORK_TYPE_1xRTT:  
            case TelephonyManager.NETWORK_TYPE_IDEN:  
                return NET_STATE_2G_CONNECTED;  
            case TelephonyManager.NETWORK_TYPE_UMTS:  
            case TelephonyManager.NETWORK_TYPE_EVDO_0:  
            case TelephonyManager.NETWORK_TYPE_EVDO_A:  
            case TelephonyManager.NETWORK_TYPE_HSDPA:  
            case TelephonyManager.NETWORK_TYPE_HSUPA:  
            case TelephonyManager.NETWORK_TYPE_HSPA:  
            case TelephonyManager.NETWORK_TYPE_EVDO_B:  
            case TelephonyManager.NETWORK_TYPE_EHRPD:  
            case TelephonyManager.NETWORK_TYPE_HSPAP:  
                return NET_STATE_3G_CONNECTED;  
            case TelephonyManager.NETWORK_TYPE_LTE:  
                return NET_STATE_4G_CONNECTED;  
            default:  
                return NET_STATE_UNKNOWN;  
            }  
        }  

    3.在AndroidManifest.xml中加上权限:

      <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> 

  • 相关阅读:
    Python语言程序设计基础(3)—— 基本数据类型
    Python语言程序设计基础(2)—— Python程序实例解析
    Python语言程序设计基础(1)—— 程序设计基本方法
    Codeforces Round #513
    Codeforces Round #514 (Div. 2)
    面试必备:Java 原子操作的实现原理[精品长文]
    最常见的Java面试题及答案汇总(一)
    Java面试题大汇总(附答案)
    Java快速排序和归并排序详解
    Java面试官最常问的volatile关键字
  • 原文地址:https://www.cnblogs.com/Sharley/p/5366136.html
Copyright © 2020-2023  润新知