项目有这个需求,监听如果网络断开后3秒内如果没有恢复则弹出网络异常的页面.于是在度娘找了些资料自己写了一个.现在分享一下出现的问题以及解决方法.
1.查到要监听网络需要使用广播接收者.于是摘了一段网上的代码自己修改了一下.如下:
public class NetWorkChangeBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
if (isNetConnected(context)) {
//网络正常,不执行任何操作.
return;
}
//没有执行return,则说明当前网络异常 3秒钟后跳转到无网络界面
LogUtils.print("LOG","------------> No internet connection");
new Handler().postDelayed(new Runnable(){
@Override
public void run() {
intent.setClass(context, NetWorkErrorActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
},3000);
}
/**
* @return
*/
public static boolean isNetConnected(Context context){
ConnectivityManager connectivityManager= (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo [] networkInfos=connectivityManager.getAllNetworkInfo();
for (int i = 0; i < networkInfos.length; i++) {
State state=networkInfos[i].getState();
if (NetworkInfo.State.CONNECTED == state) {
LogUtils.print("LOG","------------> Network is ok");
return true;
}
}
return false;
}
}
注意广播接收者需要在清单文件AndroidManifest.xml中的application标签中进行注册.
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
>
<!-- 网络监听的广播接收者 -->
<receiver android:name="项目路径.NetWorkChangeBroadcastReceiver" android:label="NetworkConnection">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"></action>
</intent-filter>
</receiver>
</application>
2.上面的步骤完成后的效果就是接收到网络变化的广播时判断如果是没有网络的状态时就跳转到网络异常的页面.下面是我写的网络异常页面的类.
public class NetWorkErrorActivity extends Activity {
private boolean isExit = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initView();
}
/**
* 初始化无网络界面.
*/
private void initView() {
setContentView(R.layout.no_network_view);
Button no_network_setting = (Button) findViewById(R.id.no_network_setting);
Button no_network_refrash = (Button) findViewById(R.id.no_network_refrash);
//跳转带系统设置
no_network_setting.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 跳转到系统的网络设置界面
Intent intent = null;
// 先判断当前系统版本
if(android.os.Build.VERSION.SDK_INT > 10){ // 3.0以上
intent = new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS);
}else{
intent = new Intent();
intent.setClassName("com.android.settings", "com.android.settings.WirelessSettings");
}
startActivity(intent);
}
});
//刷新页面的点击
no_network_refrash.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
boolean connected = NetWorkChangeBroadcastReceiver.isNetConnected(NetWorkErrorActivity.this);
if(connected){
Intent intent = new Intent(NetWorkErrorActivity.this,HomeActivity.class);
startActivity(intent);
finish();
}else{
Toast.makeText(NetWorkErrorActivity.this, "Network exception, please check your network connection.", Toast.LENGTH_SHORT).show();
}
}
});
}
/** 监听返回键,3秒内双击则退出程序,否则重置判断条件 */
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK){
ToQuitTheApp();
return false;
}else{
return super.onKeyDown(keyCode, event);
}
}
/**
* 是否退出应用的方法
*/
private void ToQuitTheApp() {
if (isExit) {
// ACTION_MAIN with category CATEGORY_HOME 启动主屏幕
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);
System.exit(0);// 使虚拟机停止运行并退出程序
} else {
isExit = true;
Toast.makeText(NetWorkErrorActivity.this, "Click again to exit the IngDan.", Toast.LENGTH_SHORT).show();
/** 如果3秒内没有点击的话发送消息把判断条件重置.*/
new Handler().postDelayed(new Runnable(){
@Override
public void run() {
isExit = false;
}
},3000);
}
}
/** 页面重新获取焦点时判断网络是否正常.如果正常就跳转到项目首页 */
@Override
protected void onResume() {
boolean connected = NetWorkChangeBroadcastReceiver.isNetConnected(this);
if(connected){
Intent intent = new Intent(this,HomeActivity.class);
startActivity(intent);
finish();
}
super.onResume();
}
}
还出现一个问题是,当我在无网络页面通过我页面上的"设置"按钮跳转到系统设置时,此时连接上网络后返回应用时又创建了一个HomeActivity首页,当时我还没有写双击back键退出应用的功能,所以发现这个问题,会导致点击back键又会回到上一个HomeActivity,原因应该是我的HomeActivity是用普通模式启动,所以每次打开都会创建新的实例,于是在清单文件中把这个Activity的启动模式设置为singleTask.解决了这个问题.
<activity android:name=".activity.HomeActivity" android:screenOrientation="portrait" android:launchMode="singleTask"/>
3.如此就完成了网络变化时的监听以及对应的处理.但是这些只是在网络发生改变时才会处理,那么我如果想在应用启动的对网络进行判断时我又该怎么做呢?
easy,机智如我早就考虑到了这个情况,这就是我把网络监听的判断方法写成静态类的原因.于是我在应用开启后跳转到应用首页时做出以下处理:
private void initView() {
setContentView(R.layout.content);
boolean connected = NetWorkChangeBroadcastReceiver.isNetConnected(this);
if(connected){
// 网络正常,做你想做的操作
}else{
//说明当前无网络连接
Intent intent = new Intent(this,NetWorkErrorActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
}
OK,到了这里我的网络监听的功能就完成了.如果哪位朋友有更好的见解可以留言交流.谢谢