查询网络连接状态

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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值