您的位置:首页 > 理论基础 > 计算机网络

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 加入

<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

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息