读书人

Android网络连接判断与处置

发布时间: 2013-02-20 12:23:22 作者: rapoo

Android网络连接判断与处理

获取网络信息需要在AndroidManifest.xml文件中加入相应的权限。

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

?

1)判断是否有网络连接

?

connectionReceiver = new BroadcastReceiver() {      @Override   public void onReceive(Context context, Intent intent) {    ConnectivityManager connectMgr = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);    NetworkInfo mobNetInfo = connectMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);    NetworkInfo wifiNetInfo = connectMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);    if (!mobNetInfo.isConnected() && !wifiNetInfo.isConnected()) {     Log.i(TAG, "unconnect");     // unconnect network     }else {    // connect network     }   }  };

?

?

2、在适当的地方注册Receiver,可以在程序中注册,在onCreate中调用如下函数即可:

?

final TelephonyManager mTelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);  mTelephonyMgr.listen(new PhoneStateListener(){@Overridepublic void onDataConnectionStateChanged(int state) {switch(state){case TelephonyManager.DATA_DISCONNECTED://网络断开break;case TelephonyManager.DATA_CONNECTING://网络正在连接break;case TelephonyManager.DATA_CONNECTED://网络连接上break;}}}, PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);

?

至于第二种方法,本人并没有去尝试过。第一种方式还是比较好用,如果要程序隐藏在后台的话,建议开个service,将BroadcastReceiver注册在service,但不要忘了取消注册。

在测试中遇到过这样的状况,将一个当前连接wifi的路由设备关闭,但是程序并没有捕捉到unconnect network,可能是因为手机设备立刻连接另一个路由设备了。

?

 1 public static boolean isNetworkAvailable(Context context) {    2         ConnectivityManager connectivity = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);    3         if (connectivity == null) {    4             Log.i("NetWorkState", "Unavailabel");    5             return false;    6         } else {    7             NetworkInfo[] info = connectivity.getAllNetworkInfo();    8             if (info != null) {    9                 for (int i = 0; i < info.length; i++) {   10                     if (info[i].getState() == NetworkInfo.State.CONNECTED) {   11                         Log.i("NetWorkState", "Availabel");   12                         return true;   13                     }   14                 }   15             }   16         }   17         return false;   18     }  


上面这个方法就是判断网络是否连接的代码,返回true表示有网络,返回false表示无网络。 在Android网络应用程序开发中,经常要判断网络连接是否可用,因此经常有必要监听网络状态的变化。android的网络状态监听可以用BroadcastReceiver来接收网络状态改变的广 播,具体实现如下:

 1 @Override    2 public void onReceive(Context context, Intent intent) {    3 Log.e(TAG, "网络状态改变");    4    5 boolean success = false;    6    7 //获得网络连接服务    8 ConnectivityManager connManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);    9 // State state = connManager.getActiveNetworkInfo().getState();   10 State state = connManager.getNetworkInfo(   11 ConnectivityManager.TYPE_WIFI).getState(); // 获取网络连接状态   12 if (State.CONNECTED == state) { // 判断是否正在使用WIFI网络   13 success = true;   14 }   15   16 state = connManager.getNetworkInfo(   17 ConnectivityManager.TYPE_MOBILE).getState(); // 获取网络连接状态   18 if (State.CONNECTED != state) { // 判断是否正在使用GPRS网络   19 success = true;   20 }   21   22 if (!success) {   23 Toast.makeText(LocationMapActivity.this, "您的网络连接已中断", Toast.LENGTH_LONG).show();   24 }    25   26 }  


在Activity的onCreate中:

 1 /** 2  3      * @author sky 4  5      * Email vipa1888@163.com 6  7      * QQ:840950105 8  9      * 获取当前的网络状态  -1:没有网络  1:WIFI网络2:wap网络3:net网络10 11      * @param context12 13      * @return14 15      */ 16 17     public static int getAPNType(Context context){ 18 19         int netType = -1;  20 21         ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 22 23         NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); 24 25          26 27         if(networkInfo==null){ 28 29             return netType; 30 31         } 32 33         int nType = networkInfo.getType(); 34 35         if(nType==ConnectivityManager.TYPE_MOBILE){ 36 37             Log.e("networkInfo.getExtraInfo()", "networkInfo.getExtraInfo() is "+networkInfo.getExtraInfo()); 38 39             if(networkInfo.getExtraInfo().toLowerCase().equals("cmnet")){ 40 41                 netType = CMNET; 42 43             } 44 45             else{ 46 47                 netType = CMWAP; 48 49             } 50 51         } 52 53         else if(nType==ConnectivityManager.TYPE_WIFI){ 54 55             netType = WIFI; 56 57         } 58 59         return netType; 60 61     } 

因为获取的是服务对象,所以这个网络状态都是时时刷新的,所以我们只需要得到网络状态就可以了!

学习在于积累,希望和大家一起分享

转载地址:http://www.cnblogs.com/qingblog/archive/2012/07/19/2598983.html

读书人网 >Android

热点推荐