Broadcast监听网络状态,ping判断网络是否可用
16lz
2021-01-25
判断网络状态,android提供了api,可以很方便的使用。但是在某些情况下,网络状态连接正常,但是并不一定就可以去访问其他网页。比如,路由器打开了,但是没有插上网线,手机GPRS打开了,但是手机已经欠费了。这种情况,有网络连接,但是依旧上不了网。根据android提供的api,我们只能判断是否网络连接正常,无法去判断是否可以访问其他网站。
最近,一个项目中遇到这样的问题,因为这个app太依赖于网络了,而且还是那种可以对外访问的网络连接,用到socket的UDP、TCP和Http(题外话)。为了解决有网络连接但是上不了网,本人查了一些资料,写了一个Demo,在这里跟猿媛们分享一下!
先简单的说一下我的思路:
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"); } } }
三: 写一个构造方法ping
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
更多相关文章
- Nginx系列教程(六)| 手把手教你搭建 LNMP 架构并部署天空网络电影
- Android客户端消息推送原理简介
- Android(安卓)远程调试工具STF——开源项目
- Idea8启蒙开发Google手机Android四步走
- 纪念为“第九维”而死的脑细胞
- Android之Wifi学习(2)------连接Wifi
- Android手机app耗电量测试工具 - Gsam Battery Monitor
- Android(安卓)RecyclerView 监听滑动
- 利用android sdk 下的adb程序捕获手机log日志