查询网络连接状态

来源:互联网 发布:mp4加速播放软件 编辑:程序博客网 时间:2024/04/29 02:57

应用程序有时需要检查网络连接状态,有三种方法:

1:通过ConnectivityManager来监控设备的网络连接状态和网络连接类型;
2:通过注册广播BreadcastReceiver来检测网络连接的变化;
3:通过PhoneStateListener来监控设备的网络的连接状态和网络连接类型;


ConnectivityManager

1:需要加权限:

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

2:获取ConnectivityManager服务:

ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

3:得到NetworkInfo:

NetworkInfo networkInfo = cm.getActiveNetworkInfo();String typeName = info.getTypeName(); //5中网络连接类型:cmwap/cmnet/wifi/uniwap/uninet  info.getType();     // 以何种方式连线 [WIFI]info.getState();        // 连线状态 [CONNECTED]info.isAvailable();     // 网络是否可用 [true]info.isConnected();     // 网络是否已经连接 [true]info.isConnectedOrConnecting(); // 网络是否已经连接或者连接中 [true]info.isFailover();      // 网络是否有问题 [false]info.isRoaming();       // 网络是否在漫游中 [false]

3:实例:
(1)检查网络的连接状态

public boolean isNetworkReachable() {    ConnectivityManager mManager =     (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);    NetworkInfo current = mManager.getActiveNetworkInfo();    if(current == null) {        return false;    }    return (current.getState() == NetworkInfo.State.CONNECTED);}

注意:如果没有可用的网络连接,NetworkInfo.getActiveNetworkInfo()会返回null;如果有可用的网络,就可以检查其状态,可 能的返回值如下:
● DISCONNECTED
● CONNECTING
● CONNECTED
● DISCONNECTING
如果返回的状态是CONNECTED,说明网络是稳定的可以用来访问远程资源。

(2)判断网络连接类型

public boolean isWifiReachable() {    ConnectivityManager mManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);    NetworkInfo current = mManager.getActiveNetworkInfo();    if(current == null) {        return false;    }    return (current.getType() == ConnectivityManager.TYPE_WIFI);}

(3)在网络访问失败时检查网络连通性:

try {        //尝试访问网络资源时,如果失败可能会抛出HttpResponseException 或        //其他IOException 异常    } catch (Exception e) {        if( !isNetworkReachable() ) {            AlertDialog.Builder builder = new AlertDialog.Builder(context);            builder.setTitle("No Network Connection");            builder.setMessage("The Network is unavailable."+ " Please try your request again later.");            builder.setPositiveButton("OK",null);            builder.create().show();        }    }

由于网络连接的状态发生改变时,会发送广播,所以我们可以通过注册BroadcastReceiver来检测网络连接

1:注册广播

    IntentFilter filter = new IntentFilter();    filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);    registerReceiver(receiver, filter);

2:定义广播接受者

private BroadcastReceiver receiver = new BroadcastReceiver(){        @SuppressWarnings("deprecation")        @Override        public void onReceive(Context context, Intent intent) {            Bundle bundle = intent.getExtras();            NetworkInfo aNetworkInfo = (NetworkInfo) bundle.                    get(ConnectivityManager.EXTRA_NETWORK_INFO);        }    };

PhoneStateListener

我们通常使用PhoneStateListener来监听手机的来电,它还可以监听网络连接的类型和状态;

TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);tm.listen(new PhoneStateListener(){            @Override            public void onDataConnectionStateChanged(int state, int networkType) {                。。。            }        }, PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);

onDataConnectionStateChanged()源码:

   /**     * Callback invoked when connection state changes.     *     * @see TelephonyManager#DATA_DISCONNECTED     * @see TelephonyManager#DATA_CONNECTING     * @see TelephonyManager#DATA_CONNECTED     * @see TelephonyManager#DATA_SUSPENDED     */    public void onDataConnectionStateChanged(int state) {        // default implementation empty    }    /**     * same as above, but with the network type.  Both called.     */    public void onDataConnectionStateChanged(int state, int networkType) {    }
0 0