Broadcast监听网络状态,ping判断网络是否可用
2015-09-25 13:18
721 查看
判断网络状态,android提供了api,可以很方便的使用。但是在某些情况下,网络状态连接正常,但是并不一定就可以去访问其他网页。比如,路由器打开了,但是没有插上网线,手机GPRS打开了,但是手机已经欠费了。这种情况,有网络连接,但是依旧上不了网。根据android提供的api,我们只能判断是否网络连接正常,无法去判断是否可以访问其他网站。
最近,一个项目中遇到这样的问题,因为这个app太依赖于网络了,而且还是那种可以对外访问的网络连接,用到socket的UDP、TCP和Http(题外话)。为了解决有网络连接但是上不了网,本人查了一些资料,写了一个Dome,在这里跟猿媛们分享一下!
先简单的说一下我的思路:
1,通过Broadcast去监听手机网络状态的变化。无非两种结果,网络连接和网络断开;
2,当网络连接的时候,我们采取ping的方式去判断网络是否可以对外访问;
代码如下:
一:需要注册广播,联网权限,网络状态变化,在AndroidManifest.xml 加入
//注册广播 包名+类名
二:写一个广播
最近,一个项目中遇到这样的问题,因为这个app太依赖于网络了,而且还是那种可以对外访问的网络连接,用到socket的UDP、TCP和Http(题外话)。为了解决有网络连接但是上不了网,本人查了一些资料,写了一个Dome,在这里跟猿媛们分享一下!
先简单的说一下我的思路:
1,通过Broadcast去监听手机网络状态的变化。无非两种结果,网络连接和网络断开;
2,当网络连接的时候,我们采取ping的方式去判断网络是否可以对外访问;
代码如下:
一:需要注册广播,联网权限,网络状态变化,在AndroidManifest.xml 加入
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" />
//注册广播 包名+类名
<service android:name="com.example.test.NetworkChangeReceive" > </service>
二:写一个广播
class NetworkChangeReceive extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager .getActiveNetworkInfo(); if (networkInfo != null && networkInfo.isAvailable()) { networkState = true; ping(networkState);//最好再次调用ping方法 Toast.makeText(MainActivity.this, "net is connections", Toast.LENGTH_SHORT).show(); Log.e(TAG, "net is connections"); } else { networkState = false; // connections Toast.makeText(MainActivity.this, "net is not connections", Toast.LENGTH_SHORT).show(); Log.e(TAG, "net is not connections"); } } }
</pre>三: 写一个构造方法ping<p></p><pre name="code" class="java">public boolean ping(boolean networkState) { InputStream input = null; BufferedReader in; StringBuffer stringBuffer; if (networkState) { try { String ip = "www.baidu.com";//之所以写百度是因为百度比较稳定,一般不会出现问题,也可以ping自己的服务器 Process p = Runtime.getRuntime().exec("ping -c 3 -w 100 " + ip);// ping3次 // 读取ping的内容 input = p.getInputStream(); in = new BufferedReader(new InputStreamReader(input)); stringBuffer = new StringBuffer(); String content = ""; while ((content = in.readLine()) != null) { stringBuffer.append(content); } // PING的状态 int status = p.waitFor(); //status 为 0 ,ping成功,即为可以对外访问;为2则失败,即联网但不可以上网 if (status == 0) { Toast.makeText(MainActivity.this, "net is available", 0) .show(); return true; } else { Toast.makeText(MainActivity.this, "net is not available", 0) .show(); return false; } } catch (IOException e) { Log.e(TAG, "IOException"); } catch (InterruptedException e) { Log.e(TAG, "InterruptedException"); } finally { if (input != null) { try { input.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } return false; }
四:MainActivity中注册广播
<pre name="code" class="java"> @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView click = (TextView) findViewById(R.id.click); click.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub 、、Intent intent = new Intent(MainActivity.this, NextActivity.class); startActivity(intent); } }); intentFilter = new IntentFilter(); // addAction intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); Log.e(TAG, "Done1"); networkChangeReceive = new NetworkChangeReceive(); registerReceiver(networkChangeReceive, intentFilter);//注册广播 } @Override protected void onDestroy() { super.onDestroy(); Log.e(TAG, "程序退出"); unregisterReceiver(networkChangeReceive);//取消注册广播 }源码下载:http://download.csdn.net/detail/kern_/9138873
相关文章推荐
- Windows 7系统笔记本创建wifi热点供手机上网的方法
- Grid ++ MIME 类型配置 载入报表数据,检查此URL及其数据,错误提示 网络服务器响应不成功
- 未能从'http://192.168.7.174/ddd/abc?abc.grf'a=00234载入报表数据,检查此URL及响应数据,错误提示:网络服务器
- 15北京网络赛 E题
- 网络基础知识学习
- AngularJS $http使用
- 2015北京网络赛 J Scores bitset+分块
- Android 各大网络请求库的比较及实战
- 网络编程--TCP-IP--2
- TCP服务器listen函数的包裹函数
- 深度学习之卷积神经网络
- Android异步下载网络图片
- HTTP Status 404 - /project/deleteProjectReback/18
- hdu5445 || 2015长春网络赛1009题 多重背包问题
- PRML 阅读笔记之神经网络(一)
- iOS 网络请求 重要
- iOS 网络操作与AFNetworking
- 黑马程序员学习(十四) java网络编程
- curl http_code状态码 含义
- 让 http 2来得更猛烈些吧