Android访问网络有很多种方式,比如WiFi,移动网络(3G等)...
他们是有一个优先级的。
- 当WiFi连接,打开3G网络,3G网络将被自动屏蔽;
- 当3G连接,连接WiFi,3G网络将被屏蔽,启用WiFi;
- 当WiFi连接,然后关闭,如果3G网络可用,将自动切换到3G网络。
这是系统默认的,可以通过API来改变这种优先级。比如:当3G连接,连接WiFi,我们希望仍然使用3G网络,那么
ConnectivityManager connMgr = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
connMgr.setNetworkPreference(ConnectivityManager.TYPE_MOBILE);
当这样设置之后,会自动断开WiFi连接。
那通过代码,怎么知道WiFi是否连接或者移动网络是否连接呢?
//判断是否有网络连接 public boolean isOnline() { ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); //connMgr.setNetworkPreference(ConnectivityManager.TYPE_MOBILE); return (networkInfo != null && networkInfo.isAvailable()); } //判断WiFi是否连接 public boolean isWifiConnected() { ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI); return (networkInfo != null && networkInfo.isConnected()); } //判断移动网络是否连接 public boolean isMobileConnected() { ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); return (networkInfo != null && networkInfo.isConnected()); }
判断WiFi是否连接,还可以通过WifiManager
//判断WiFi是否连接 public boolean isWifiConnected() { WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); if (wifiManager.isWifiEnabled()) { WifiInfo wifiInfo = wifiManager.getConnectionInfo(); return wifiInfo != null && SupplicantState.COMPLETED == wifiInfo.getSupplicantState(); } return false; }
它还提供了很多操控WiFi的方法,比如连接或断开WiFi连接,打开或关掉WiFi等。
有WiFi连接并不等于连接到Internet。比如:手机连接到无线路由器,而无线路由器没有连接Internet,这种情况可以用代码容易地判断
//判断WiFi连接时是否能够访问Internet public boolean hasWifiInternetAccess() { WifiManager mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); if(mWifiManager.isWifiEnabled()) { return mWifiManager.pingSupplicant(); } return false; }
上面的方法其实并不能准确的判断当WiFi连接是是否可以访问Internet。例如,当连接到机场的WiFi,它需要打开浏览器,在弹出的页面上输入用户名密码,此时pingSupplicant返回的是TRUE,当这种情况时,只能通过代码访问某个网址,检查返回值来检测是否能够上网。