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