admin 管理员组

文章数量: 1184232

Android 监听网络变化弹出提示窗口

项目有这个需求,监听如果网络断开后3秒内如果没有恢复则弹出网络异常的页面.于是在度娘找了些资料自己写了一个.现在分享一下出现的问题以及解决方法.


1.查到要监听网络需要使用广播接收者.于是摘了一段网上的代码自己修改了一下.如下:

public class NetWorkChangeBroadcastReceiver extends BroadcastReceiver {@Overridepublic 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(){@Overridepublic 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标签中进行注册.

<applicationandroid: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.conn.CONNECTIVITY_CHANGE"></action></intent-filter></receiver></application>

2.上面的步骤完成后的效果就是接收到网络变化的广播时判断如果是没有网络的状态时就跳转到网络异常的页面.下面是我写的网络异常页面的类.

public class NetWorkErrorActivity extends Activity {private boolean isExit = false;@Overrideprotected 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() {@Overridepublic 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() {@Overridepublic 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秒内双击则退出程序,否则重置判断条件 */@Overridepublic 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(){@Overridepublic void run() {isExit = false;}},3000);}}/** 页面重新获取焦点时判断网络是否正常.如果正常就跳转到项目首页 */@Overrideprotected void onResume() {boolean connected = NetWorkChangeBroadcastReceiver.isNetConnected(this);if(connected){Intent intent = new Intent(this,HomeActivity.class);startActivity(intent);finish();}super.onResume();}
}


说明:这个页面xml只有一句异常提示语跟两个按钮,就不贴代码了.两个按钮是"刷新"跟"设置",做的时候发现一个问题是,无网络状态下连接wifi,之后快速返回到网络异常的页面时,无法跳转到项目首页.判断原因是连接wifi时网络改变的广播不是即时发送的,所以在onResume方法中判断条件不成立,于是页面没有做出改变.于是添加了一个"刷新"按钮,当出现这种情况时,点击刷新重新去对网络做判断再重走 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,到了这里我的网络监听的功能就完成了.如果哪位朋友有更好的见解可以留言交流.谢谢



本文标签: Android 监听网络变化弹出提示窗口