BroadReceiver 动态监测网络状态
如下图,单检测到网络状态断开或无连接时,显示警告布局
这是开发中非常常见的一个问题,监听网络状态有不同方法:
1.轮询 就是每隔一段时间,获取一次网络状态,达到监听网络状态的目的,缺点:效率较低
扩展:轮询法的概念是,由CPU定时发出询问,依序询问每一个周边设备是否需要其服务,有即给予服务,服务结束后再问下一个周边,接着不断周而复始。轮询法实作容易,但效率偏低。
2.使用广播接收器动态监听网络状态,广播接收器与轮询相比,可以理解为轮训是主动访问,广播则是一种被动的获得改变。下面代码主要说说广播BroadReceiver 动态监测网络状态
/** * 监听网络状态 * * @author Keno * */ private class NetRecerve extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals( ConnectivityManager.CONNECTIVITY_ACTION)) { // 获得系统网络连接管理服务 ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); // 获得网络连接信息 NetworkInfo networkInfo = cm.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected()) { MyLog.i(TAG, "网络连接正常"); warning_layout.setVisibility(View.GONE); } else { MyLog.i(TAG, "无连接"); warning_layout.setVisibility(View.VISIBLE); } } } }
IntentFilter intentFilterNet = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); intentFilterNet.addCategory(Intent.CATEGORY_DEFAULT); netReceive = new NetRecerve(); registerReceiver(netReceive, intentFilterNet);
为无网络提示布局绑定监听事件,当网络状态为无连接时,点击该布局进入系统网络设置界面
/** * 打开系统网络设置 * * @param context */ public static void openSettingNet(Context context) { Intent intent = null; // 判断手机系统的版本 即API大于10 就是3.0或以上版 if (android.os.Build.VERSION.SDK_INT > 10) { intent = new Intent( android.provider.Settings.ACTION_WIRELESS_SETTINGS); MyLog.d(TAG, "api level 10"); } else { intent = new Intent(); ComponentName component = new ComponentName("com.android.settings", "com.android.settings.WirelessSettings"); intent.setComponent(component); intent.setAction("android.intent.action.VIEW"); MyLog.d(TAG, "api level less 10"); } context.startActivity(intent); }
最后这段打开系统应用的代码,应该要注意不同API版本的区别
调用各种系统应用的说明 http://blog.csdn.net/lang791534167/article/details/24767437